在Linux上,我在使用ofstream类将UTF-16写入文件时遇到了一些麻烦,而相同的代码在Windows上运行得非常好。以下是示例代码
MyString content;
content = L"hello\r\n";
const short unsigned int* output = content.asUnicodeType<MyString::UTF16>().c_str();
ofstream outFile("test.txt", std::ios::out | std::ios::binary);
outFile.write((char *)output, content.size() * sizeof(MyString::UTF16));
//outFile.write((char *)content.c_str(), content.size() * sizeof(wchar_t));
outFile.close();
return 0;
我已确认输出已正确转换为UTF-16格式
(gdb) x /16b output
0x61a288: 104 0 101 0 108 0 108 0
0x61a290: 111 0 13 0 10 0 0 0
但是,完成后我试图打开文件。尽管我要求它以二进制模式写入,但看起来内容仍被写为UTF8
如果我将其切换并以宽字符形式写入,那么内容在Linux上正确写为UTF32。
任何建议都会很棒!
PS:由于平台限制,我无法使用C ++ 11标准由于
答案 0 :(得分:1)
这实际上是将内容写成UTF-16,但因为我错过了BOM,Windows上的文件打开时无法识别它,所以我认为它将内容写成UTF8
答案 1 :(得分:1)
如果content.asUnicodeType<MyString::UTF16>()
返回std::string
,那么您有未定义的行为。 .c_str()
返回std::string
拥有的c字符串,但在您的情况下,std::string
是一个临时对象,导致其c字符串被异时删除。
要解决此问题,只要您需要c字符串,就必须保持std::string
:
auto output_s = content.asUnicodeType<MyString::UTF16>();
const short unsigned int* output = output_s.c_str();
我不知道这是否能解决您的问题,但无论如何都要修复未定义的行为。
哦,顺便说一句,尝试在任何地方使用utf8,尤其是在读写文件时。无论你付出多少努力来获得正确的权利,你都可能做错了。 见http://utf8everywhere.org