これまでのところ、wofstreamを使用してutf-16でファイル出力を試しています。しかし、新しい行を書くのに問題があります。メモ帳と 16 進エディタでわかったように、Windows の新しい行は、LineFedd と CarrigeReturn (0x000A と 0x000D) の 2 つのシンボルに対応しています。これをプログラムで再現しようとすると、奇妙な結果になりました。
#include <fstream>
#include <codecvt>
#include <locale>
#define ENDL L"\u000a\u000d"
using namespace std;
int main()
{
locale utf16(locale(), new codecvt_utf16<wchar_t, 0x10ffffUL, little_endian>());//for writing UTF-16
wofstream fout(L"text.txt");
fout.imbue(utf16);
const unsigned short BOM= 0xFEFF;
fout.write((wchar_t*)&BOM, 1);
fout<<L"some text"<<ENDL<<L"more text";
fout.close();
}
ENDL に続くテキストは完全にめちゃくちゃです。16進エディタで原因を見つけました。ENDL の場合、 0D 0A 00 0D 00 を書き込みます。つまり、何らかの理由で、改行文字の前に不必要で不快な有害な 0D バイトを書き込み、後続のすべてのバイトを右にシフトさせ、utf-16 エンコーディングを台無しにします。
なぜこれが起こるのか、どうすれば修正できるのかわかりません