2013-07-17 99 views
1

是否可以使用std :: fstream来使包含UTF-8编码的std :: string可以传输到UTF-16文件?使用std :: fstream编写UTF16文件

我尝试使用UTF8到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方面似乎表明它可以用来读取和写入UTF-8文件,而不是UTF-16 - 是否正确,如果有的话,是否有一种简单的方法可以做我想做的事情?

+1

使用UTF-8内部和UTF-16外部是不正确的。如果UTF-16有意义的话,它就像是一种内部编码,可以简化所有那些误导性足以使用UTF-16的90年代原生API。 – bames53

+0

@ bames53 - 要求与Windows应用程序的兼容性,不幸的是读取和写入“UTF16LE”文件(尽管考虑到过去几周遇到的困难的数量,它们可能实际上是某种微软UCS2-ish憎恶)。 –

回答

3

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

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

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

+0

我想这也意味着我不能使用codecvt_mode标志来确保输出的字节顺序和BOM - 我必须自己写这些。 –

+0

@MadKeithV正确..但是如果你要使用utf-8 - > wide - > utf-16,你可以使用它们(参见编辑) – Cubbi