到目前为止,我正在尝试使用wofstream在utf-16中进行文件输出。但是我有一个问题,要写一句新的话。正如我在记事本和十六进制编辑器中发现的那样,windows上的新行对应于两个符号: 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,它写0D0A000D00。也就是说,由于某种原因,它在Linefeed字符之前写入不必要的有害的0D字节,从而导致以下所有字节向右移动,从而扰乱utf-16的编码。
我不明白为什么会发生这种事,我怎样才能解决
发布于 2014-05-27 07:55:38
尝试以二进制模式打开文件:
std::wofstream fout(L"text", std::ios_base::binary);我没有使用Windows系统的经验,但是操作系统似乎对用行尾序列代替新词毫无帮助。
另外,我首先要对修改后的区域设置和文件进行imbue():一旦读取了一个字符,调用imbue()就没有效果,也没有定义的行为(不要回忆起哪个是临时的)。我认为没有什么可以阻止流读取open()上的第一个缓冲区。不过,我不认为这是你真正的问题。
https://stackoverflow.com/questions/23883780
复制相似问题