UTF-16 codecvt方面

时间:2009-12-17 16:51:34

标签: c++ locale utf-16 facet codecvt

关于locales的问题 并在this question中进行了描述:我真正想做的是在熟悉UTF-16文件的语言环境中安装codecvt facet。

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

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

2 个答案:

答案 0 :(得分:2)

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

codecvt类型在Code Conversions

部分中有所描述

答案 1 :(得分: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之间进行转换,具体取决于Elemchar16_t的UCS2,char32_t的UCS4,wchar_t的平台相关1}})。
    • 还有两个默认的模板参数(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之间进行转换,具体取决于Elemchar16_t的UCS2,char32_t的UCS4,wchar_t的平台相关1}})。
    • 还有两个默认的模板参数(unsigned long MaxCode = 0x10ffffstd::codecvt_mode Mode = (std::codecvt_mode)0),并且继承自std::codecvt<Elem, char, std::mbstate_t>

codecvt_utf8 and codecvt_utf16 will convert between the specified UTF and either UCS2 or UCS4, depending on the size of Elem.因此,wchar_t将在16到31位的系统上指定UCS2(例如Windows,它是16位),或者在系统上指定UCS4无论wchar_t字符串是否实际使用该编码,至少32位(例如Linux,它是32位);在对wchar_t字符串使用不同编码的平台上,如果您不小心,这可能会引起问题。

有关详细信息,请参阅CPP参考:

请注意,标题codecvt的支持仅在最近才添加到libstdc++。如果您使用较旧版本的Clang或GCC,则可能必须使用libc++,如果您想使用它。
请注意,2015之前的Visual Studio版本实际上不支持char16_tchar32_t;如果以前版本中存在这些类型,则它们将分别作为unsigned shortunsigned int的typedef。另请注意,旧版本的Visual Studio有时会在UTF编码之间转换字符串,而Visual Studio 2015 has a glitch that prevents codecvt from working properly with char16_t and char32_t, requiring the use of same-sized integral types instead