これに関してSOにはたくさんの質問がありますが、それらのほとんどはwstringをファイルに書き戻すことについて言及していません。たとえば、私はこれを読んで見つけました:
// open as a byte stream
std::wifstream fin("/testutf16.txt", std::ios::binary);
// apply BOM-sensitive UTF-16 facet
fin.imbue(std::locale(fin.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
// read
std::wstring ws;
for(wchar_t c; fin.get(c); )
{
std::cout << std::showbase << std::hex << c << '\n';
ws.push_back(c);
}
私は書くために同様のものを試しました:
std::wofstream wofs("/utf16dump.txt", std::ios::binary);
wofs.imbue(std::locale(wofs.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
wofs << ws;
しかし、それはゴミを生成します(またはNotpad ++とvimはそれを解釈できません)。タイトルで述べたように、Im on Win、ネイティブ C++、VS 2010。
入力ファイル:
t€stUTF16✡
test
これが結果です。
t€stUTF16✡
test
16 進数に変換:
0000000: 7400 ac20 7300 7400 5500 5400 4600 3100 t.. s.t.U.T.F.1.
0000010: 3600 2127 0d00 0a00 7400 6500 7300 7400 6.!'....t.e.s.t.
0000020: 0a
...
vimの通常の出力:
t^@¬s^@t^@U^@T^@F^@1^@6^@!'^M^@ ^@t^@e^@s^@t^@
編集:UTF8を使用してしまいました。Andrei Alexandrescu は、これが最高のエンコーディングであり、大きな損失はないと言っています。:)