Unicode 使用std::fstream写入UTF16文件

Unicode 使用std::fstream写入UTF16文件,unicode,c++11,locale,codecvt,Unicode,C++11,Locale,Codecvt,是否可以嵌入std::fstream,以便包含UTF-8编码的std::字符串可以流式传输到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<

是否可以嵌入std::fstream,以便包含UTF-8编码的std::字符串可以流式传输到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;
std::fstream utf16_-stream(“test.txt”,std::ios_-base::trunc | std::ios_-base::out);
imbue(std::locale(std::locale(),新编码VT\uUTF8\uUTF16);
std::string utf8_string=“\x54\\xE2\x83\xac\x73\x74”;
utf16_stream文件流(根据
std::basic_filebuf
§22.4.1.4.2[locale.codecvt.virtuals]/3
的要求)不支持N:M字符编码转换,UTF8内部/utf16外部的情况就是这样

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


或者,也可以先将UTF-8转换为wide,然后使用生成UTF-16的字节序列,因此可以用于文件流。

我想这也意味着我不能使用codecvt_模式标志来确保输出的endianness和BOM-我也必须自己编写这些?@MadKeithV Right..但是如果你愿意,你可以使用它们你将使用utf-8->宽->utf-16(参见编辑)内部使用UTF-8,外部使用UTF-16是有悖常理的。如果说UTF-16有意义的话,那就是作为一种内部编码来简化所有90年代的API的使用,这些API被误导到足以在本机使用UTF-16。@bames53-要求与那些不幸读写“UTF16LE”文件的Windows应用程序兼容(尽管考虑到我在过去几周遇到的困难数量,它们实际上可能是某种微软UCS2式的令人憎恶的东西)。