【发布时间】:2014-07-03 21:25:16
【问题描述】:
我了解 C++11 中的std::codecvt<char16_t, char> 执行 UTF-16 和 UTF-8 之间的转换,std::codecvt<char32_t, char> 执行 UTF-32 和 UTF-8 之间的转换。是否可以在 UTF-8 和 ISO 8859-1 之间进行转换?
考虑:
const char* s = "\u00C0";
如果我打印此字符串并且我的终端编码设置为 UTF-8,我将看到字符 À。但是,如果我将终端的编码设置为 ISO 8859-1,则打印该字符串将不会打印出所需的字符。如果我的终端编码设置为 ISO 8859-1,我如何将 s 转换为字符串,在打印时将显示字符 À?
我知道这可以通过 iconv 之类的库来完成,但我很好奇是否可以仅使用 C++ 标准库来完成。我问这个问题不是因为我不想使用 iconv,而是因为我不太了解语言环境在 C++ 中是如何工作的。
【问题讨论】:
-
C++ 标准中没有任何明确的非 Unicode 编码。您拥有可以相互转换的“系统编码”,并且可能指示您的系统使用 ISO 8859-1(可能通过环境变量);或使用显式转换库,例如
iconv。 -
@KerrekSB,您将如何与“系统编码”相互转换?
-
查看底部附近的表格of this documentation。例如。
mbrtoc32从系统的窄编码转换为 UTF-32。 (你可能想知道where the<cuchar>header is...)
标签: c++ c++11 character-encoding locale