c++ - C++ 是否支持 UTF-8、UTF-16 和 UTF-32 以外的字符编码之间的转换?

标签 c++ c++11 character-encoding locale

我明白 std::codecvt<char16_t, char>在 C++11 中执行 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,打印该字符串将不会打印出所需的字符。我将如何转换 s变成一个字符串,打印时将显示字符 À如果我的终端编码设置为 ISO 8859-1?

我知道这可以用 iconv 这样的库来完成,但我很好奇是否可以仅使用 C++ 标准库来完成。我问这个问题不是因为我不想使用 iconv,而是因为我真的不明白语言环境在 C++ 中是如何工作的。

最佳答案

除了标准强制编码外,C++ 还支持通过语言环境实现定义的编码列表:

#include <locale>
#include <codecvt>
#include <iostream>

template <typename Facet>
struct usable_facet : Facet {
  using Facet::Facet;
};

using codecvt = usable_facet<std::codecvt_byname<wchar_t, char, std::mbstate_t>>;

int main() {
  std::wstring_convert<codecvt> convert(new codecvt(".1252")); // platform specific locale strings

  std::wstring w = convert.from_bytes("\u00C0");
}

不幸的是,wchar_t 的一个问题是标准 mandates只是它对所有语言环境都使用固定宽度编码,但不要求它在不同语言环境中使用相同编码,因此您不能可移植地转换为 wchar_t使用一种语言环境,然后使用不同的语言环境将其转换回 char

使用类似 std::mbrtoc32 的函数可能会为此类转换提供一些可移植支持和相关功能,但这些尚未广泛实现。

I understand that this can be done with a library such as iconv, but I am curious whether it can be done using only the C++ standard library. I ask this question not because I don't want to use iconv, but because I don't really understand how locales work in C++.

语言环境库的设计并不适合现代使用。 C 和 C++ 本身混淆了编码与字符集,并且语言环境将词法和正字法问题与编码等计算方面混为一谈。

语言环境如何工作是一个比适用于 stackoverflow 答案更广泛的主题,但有 books关于这个话题。您可能还需要阅读特定于平台的 Material ,因为该标准并未真正为大部分功能提供任何上下文。例如,语言环境库支持消息目录,但不会告诉您它们是什么或您实际如何使用 make one因为 C++ 未对其功能进行标准化。

关于c++ - C++ 是否支持 UTF-8、UTF-16 和 UTF-32 以外的字符编码之间的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24563521/

相关文章:

c++ - 如何使用 cmake 管理多个构建目标配置

html - 浏览器不使用 utf-8 但设置了元标记

PHP URLDecode/UTF8_Encode 字符集特殊字符问题

vb.net - 如何将 UnicodeEncoding 输出转换为纯字符串?

c++ - 返回对类静态数据成员的引用的正确方法是什么? (我正在使用 Qt,以防它有所作为)

c++ - 在不同语言的程序之间共享变量的事实标准是什么?

c++ - 使用预处理器将 JSON 作为字符串嵌入到 C++ 代码中

c++ - make_shared 创建 std::shared_ptr?海湾合作委员会 4.6.2

c++ - 有没有办法让模板根据参数是否是模板类型和值来执行特定的操作?

c++ - 为什么这个基本线程程序会因 Clang 而失败,但会通过 g++?