为什么ofstream不能在二进制模式下在linux上编写utf16?

时间:2014-10-01 20:33:52

标签: c++ linux utf-16 ofstream c++03

在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标准

由于

2 个答案:

答案 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