【发布时间】:2014-05-27 07:47:18
【问题描述】:
我正在尝试使用 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 编码。
我不明白为什么会发生这种情况以及如何解决它
【问题讨论】:
-
这似乎是一个错误......
-
VS 2013 为我抛出 this,根据 2.3/2 是正确的(f c-char-sequence、s-char-sequence 之外的通用字符名称的十六进制值, 或字符或字符串文字的 r-char-sequence 对应于控制字符(在 0x00–0x1F 或 0x7F–0x9F 的任一范围内,均包括在内)或基本源字符集中的字符,程序有问题-形成。)。但这不是您的问题所在。
-
我实际上使用英特尔编译器而不是 MVS,它吞下了它。但仍然用 L"\r\n" 替换 ENDL 定义具有相同的结果。
-
@AndreyPro 看起来你应该提交bug report。
-
我没有微软账户,注册所有我不想使用的服务感到不安
标签: visual-c++ utf-16 wofstream