用std :: fstream编写UTF16文件

时间:2013-07-17 11:52:01

标签: unicode c++11 locale codecvt

是否可以灌注std :: fstream,以便包含UTF-8编码的std :: string可以流式传输到UTF-16文件?

我使用utf8-to-utf16方面尝试了以下方法,但结果文件仍然是UTF-8:

std::fstream utf16_stream("test.txt", std::ios_base::trunc | std::ios_base::out);
utf16_stream.imbue(std::locale(std::locale(), new codecvt_utf8_utf16<wchar_t, 
                               std::codecvt_mode(std::generate_header | std::little_endian)>);

std::string utf8_string = "\x54\\xE2\x83\xac\x73\x74";

utf16_stream << utf8_string;

codecvt_utf8_utf16 facet的引用似乎表明它可用于读取和写入UTF-8文件,而不是UTF-16 - 这是正确的,如果是这样,有没有一种简单的方法来做我想做的事情?

1 个答案:

答案 0 :(得分:3)

文件流(根据std::basic_filebuf §22.4.1.4.2[locale.codecvt.virtuals]/3的要求)不支持N:M字符编码转换,就像UTF8内部/ UTF16外部一样。

你必须建立一个UTF-16字符串,例如通过使用wstring_convert,将其重新解释为一个字节序列,并使用通常(非转换)std::ofstream输出它。

或者,或者,首先将UTF-8转换为宽,然后使用std::codecvt_utf16生成UTF-16作为字节序列,因此可以与文件流一起使用。