1

到目前为止,我正在尝试使用 wofstream 以 utf-16 格式输出文件。但是我有一个问题要写一个新行。正如我在记事本和十六进制编辑器中发现的那样,Windows 上的新行对应于 2 个符号:LineFedd 和 CarrigeReturn(0x000A 和 0x000D)。试图以编程方式重复这一点会导致奇怪的结果。

#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 后面的文字完全乱了套。我用十六进制编辑器找到了原因。对于 ENDL,它写入 0D 0A 00 0D 00 。也就是说,由于某种原因,它会在换行符之前写入不必要的有害 0D 字节,这会导致所有后续字节向右移动,从而弄乱 utf-16 编码。

我不明白为什么会发生这种情况,我该如何解决

4

1 回答 1

1

尝试以二进制模式打开文件:

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

我没有使用 Windows 系统的经验,但似乎操作系统正在无益地用行尾序列替换 newlunes。

另外,我会首先imbue()修改语言环境和open()文件:一旦读取了一个字符,调用imbue()要么没有效果,要么没有定义的行为(不记得哪个副手)。我认为没有什么可以阻止流读取第一个缓冲区open()。不过,我认为这不是您的实际问题。

于 2014-05-27T07:55:38.667 回答