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

2023-12-08

我明白那个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只是它对所有语言环境使用固定宽度编码,但不要求它使用same在不同的语言环境中进行编码,因此您无法移植到wchar_t使用一种语言环境,然后将其转换回char使用不同的区域设置。

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

我知道这可以使用 iconv 等库来完成,但我很好奇是否可以仅使用 C++ 标准库来完成。我问这个问题不是因为我不想使用 iconv,而是因为我不太了解语言环境在 C++ 中的工作原理。

语言环境库的设计并不真正适合现代使用。 C 和 C++ 本身对编码与字符集感到困惑,并且语言环境将词汇和拼写问题与编码等计算方面混为一谈。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐