3

从这个关于语言环境
的问题扩展 并在这个问题中描述:我真正想做的是在理解 UTF-16 文件的语言环境中安装一个 codecvt 方面。

我可以自己写。但我不是 UTF 专家,因此我相信我会得到它几乎正确的;但它会在最不方便的时候坏掉。所以我想知道是否有任何资源(在网络上)可以从 C++ 使用经过同行评审和测试的预构建 codecvt(或其他)方面?

原因是读取文件时的默认语言环境(在我的系统 MAC OS X 10.6 上)只是将 1 字节转换为 1 wchar_t 而没有转换。因此 UTF-16 编码文件被转换为包含大量空 ('\0') 字符的 wstrings。

4

2 回答 2

2

我不确定“Web 上的资源”是否意味着免费提供,但Dinkumware Conversions Library听起来可以满足您的需求——前提是该库可以集成到您的编译器套件中。

这些codecvt类型在代码转换部分中进行了描述。

于 2009-12-17T17:38:30.933 回答
0

从 C++11 开始,还有其他标准codecvt特化和类型,用于在各种 UTF - x和 UCS x字符序列之间进行转换;其中之一可能适合您的需求。

<locale>

  • std::codecvt<char16_t, char, std::mbstate_t>:在 UTF-16 和 UTF-8 之间转换。
  • std::codecvt<char32_t, char, std::mbstate_t>:在 UTF-32 和 UTF-8 之间转换。

<codecvt>

  • std::codecvt_utf8_utf16<typename Elem>:在 UTF-8 和 UTF-16 之间转换,其中 UTF-16 代码点按指定存储Elem(请注意,如果char32_t指定,则每个 只会存储一个代码点char32_t)。
    • 有两个额外的默认模板参数(unsigned long MaxCode = 0x10ffffstd::codecvt_mode Mode = (std::codecvt_mode)0),并继承自std::codecvt<Elem, char, std::mbstate_t>.
  • std::codecvt_utf8<typename Elem>:在 UTF-8 和 UCS2 或 UCS4 之间转换,具体取决于Elem(UCS2 for char16_t,UCS4 for char32_t,platform-dependent for wchar_t)。
    • 有两个额外的默认模板参数(unsigned long MaxCode = 0x10ffffstd::codecvt_mode Mode = (std::codecvt_mode)0),并继承自std::codecvt<Elem, char, std::mbstate_t>.
  • std::codecvt_utf16<typename Elem>:在 UTF-16 和 UCS2 或 UCS4 之间转换,具体取决于Elem(UCS2 用于char16_t,UCS4 用于char32_t,平台相关用于wchar_t)。
    • 有两个额外的默认模板参数(unsigned long MaxCode = 0x10ffffstd::codecvt_mode Mode = (std::codecvt_mode)0),并继承自std::codecvt<Elem, char, std::mbstate_t>.

codecvt_utf8并将codecvt_utf16在指定的 UTF 和 UCS2 或 UCS4 之间进行转换,具体取决于Elem. 因此,wchar_t将在 16 到 31 位的系统上指定 UCS2(例如 Windows,它是 16 位),或在至少 32 位的系统上指定 UCS4(例如 Linux,它是 32 位),无论wchar_t字符串是否实际使用该编码;在对字符串使用不同编码的平台上,wchar_t如果您不小心,这将导致问题是可以理解的。

有关更多信息,请参阅 CPP 参考:

请注意,仅在最近codecvt才添加了对标头的支持。libstdc++如果使用旧版本的 Clang 或 GCC,libc++如果您想使用它,您可能必须使用 。
请注意,2015 年之前的 Visual Studio 版本实际上不支持char16_tand char32_t; 如果这些类型存在于以前的版本中,它将分别作为unsigned short和的类型定义unsigned int。另请注意,旧版本的 Visual Studio 有时在 UTF 编码之间转换字符串时可能会遇到问题,并且Visual Studio 2015 有一个故障会阻止codecvtchar16_t和正常工作char32_t,需要使用相同大小的整数类型来代替

于 2016-12-27T22:18:45.937 回答