Visual c++ wofstream写入不必要的字节

Visual c++ wofstream写入不必要的字节,visual-c++,utf-16,wofstream,Visual C++,Utf 16,Wofstream,到目前为止,我正在使用wofstream在utf-16中试验文件输出。但我有一个问题,写一个新的行。我在记事本和十六进制编辑器中发现,windows上的新行对应于两个符号:LineFedd和CarrigeReturn(0x000A和0x000D)。试图以编程方式重新导入此内容会导致奇怪的结果 #include <fstream> #include <codecvt> #include <locale> #define ENDL L"\u000a\u000d"

到目前为止,我正在使用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“\u000a\u000d”
使用名称空间std;
int main()
{
区域设置utf16(区域设置(),新编码VT_utf16());//用于编写UTF-16
wofstream fout(L“text.txt”);
fout.imbue(utf16);
常量无符号短BOM=0xFEFF;
四、编写((wchar_t*)和BOM,1);

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

std::wofstream fout(L"text", std::ios_base::binary);
我没有使用Windows系统的经验,但似乎操作系统在用线尾序列取代纽伦斯是没有帮助的


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

这似乎是一个bug…VS 2013对我来说是正确的,根据2.3/2(f)的规定,字符或字符串文本的c-char序列、s-char序列或r-char序列之外的通用字符名的十六进制值对应于控制字符(在0x00–0x1F或0x7F–0x9F范围内,两者都包括在内)或基本源字符集中的某个字符,该程序的格式不正确。)。但这并不是您的问题所在。我实际上使用的是MVS上的英特尔编译器,它吞并了该程序。但仍将ENDL定义替换为L“\r\n”有相同的结果。@AndreyPro看起来你应该提交一个文件。我没有microsoft帐户,并且不想注册所有我不想使用的服务。在二进制模式下打开有帮助。我想知道,这是否会导致普通文本出现问题。文本与二进制模式的效果正是在o结尾处替换换行符的行为f行序列[在某些系统上]。
binary
修复了它,尽管OP不应该使用通用字符名作为控制字符。它看起来像是VS2013的
codevt_utf16
实现中的一个bug。好的,如果使用binary模式没有副作用,我就坚持使用它