1

これまでのところ、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 エンコーディングを台無しにします。

なぜこれが起こるのか、どうすれば修正できるのかわかりません

4

1 に答える 1

1

ファイルをバイナリモードで開いてみてください:

std::wofstream fout(L"text", std::ios_base::binary);

私は Windows システムの経験がありませんが、OS が改行文字列を行末シーケンスに置き換えて役に立たないようです。

また、最初imbue()に変更されたロケールとopen()ファイルを使用します。文字が読み取られると、呼び出しimbue()は効果がないか、未定義の動作になります (どれがオフハンドか思い出さないでください)。でストリームが最初のバッファを読み取るのを妨げるものは何もないと思いますopen()。しかし、それはあなたの実際の問題ではないと思います。

于 2014-05-27T07:55:38.667 に答える