【发布时间】:2018-05-24 02:40:15
【问题描述】:
想象一下,我决定在我的 C++11 程序中使用 use UTF-8 everywhere internally,所以我有一个 std::string,其中包含以 UTF-8 编码的文本。我现在想做一些该文本的 IO。例如,将其写入std::cout。虽然我在内部使用了 UTF-8,但我不能假设程序用户和操作环境也如此强制使用 UTF-8。出于好的或坏的原因,我应该通过std::cout 发送的文本的字符编码可能不是UTF-8。 My program must perform a conversion,获取我的 UTF-8 编码文本并将其转换为 std::cout 期望的编码。如何找出该输出流上的编码,然后进行字符编码?
查看标准 C++ 流的声明,看起来我可以使用 std::io_base::get_loc 获取输出流的“语言环境”,然后获取流的 std::codecvt“代码转换方面”。但是我应该获得哪个方面?以及如何实际使用该方面将 UTF-8 转换为输出编码?
如果标准库的那些设施不能完成任务,我还有什么其他选择?
【问题讨论】:
-
在哪个操作系统、终端、版本等上
-
在 C++ 中没有标准的方法可以做到这一点。如果您的用户不喜欢 UTF-8,那么抛弃它们并迎合更好的用户在经济上是可行的。
-
@Surt 我想写可移植的代码。当然,语言环境和语言环境方面的全部意义在于,因此您不需要知道这些细节:语言环境和方面的实现会小心。
-
语言环境和语言环境方面以及围绕它们的一大堆 C++ API 是彻底失败的。目前没有可移植的 C++ 程序利用语言环境并支持 Unicode。什么都写不出来。
-
您的其他选择是:(1) 第三方库,如 icu 或 iconv (2) 知道并依赖于在流行的实现中宽字符串实际上是 utf16 或 ucs4 编码的事实