unicode - 使用 std::fstream 写入 UTF16 文件

标签 unicode c++11 locale codecvt

是否可以注入(inject) 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 方面的引用似乎表明它可用于读取和写入 UTF-8 文件,而不是 UTF-16 - 这是正确的吗?如果是,是否有一种简单的方法可以完成我想做的事情?

最佳答案

文件流(根据 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 作为字节序列,因此可以与文件流一起使用。

关于unicode - 使用 std::fstream 写入 UTF16 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17699074/

相关文章:

sql-server - SQL-Server 中奇怪的字符串行为

c++ - C++11 中的无锁缓存实现

c++ - 如何用空白字段改进 std::tuple?

java - JDK 未本地化 JComponent

java - 使用 Java 的 Locale 框架来表示中土世界的最佳方式是什么?

java - 根据语言环境(国家)获取当前日期和时间

使用 DictWriter for utf-8 时出现 UnicodeEncodeErrors

python - 欧元、英镑和美元价格的正则表达式

iphone - 如何在UIlabel中显示上标星号

c++ - vector 的算术运算