代码之家  ›  专栏  ›  技术社区  ›  Loki Astari

UTF-16编解码器

  •  3
  • Loki Astari  · 技术社区  · 16 年前

    由此引出关于 locales
    并在 this question

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

    原因是读取文件时的默认区域设置(在我的系统MAC OS X 10.6上)仅将1个字节转换为1个wchar\t,而不进行任何转换。因此,UTF-16编码的文件被转换为包含大量空('\0')字符的wstring。

    2 回复  |  直到 9 年前
        1
  •  2
  •   seh Alexei    7 年前

    我不确定你所说的“网上资源”是否意味着免费提供,但有一个原因 Dinkumware Conversions Library 这听起来很适合您的需要,前提是该库可以集成到您的编译器套件中。

    codecvt 类型在本节中介绍 Code Conversions .

        2
  •  0
  •   Community Mohan Dere    9 年前

    从C++11开始,还有其他标准 codecvt 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 ).
      • 有两个附加的默认模板参数( unsigned long MaxCode = 0x10ffff std::codecvt_mode Mode = (std::codecvt_mode)0 ),并继承自 std::codecvt<Elem, char, std::mbstate_t> .
    • std::codecvt_utf8<typename Elem> 元素 (UCS2用于 char16_t char32_t ,平台依赖于 wchar_t ).
      • std::codecvt_模式=(std::codecvt_模式)0 标准::编解码器vt<元素、字符、标准::mbstate\u t> .
    • std::codecvt_utf16<typename Elem> char16\u t ,UCS4用于 char32_t wchar\t ).
      • 有两个附加的默认模板参数( 无符号长MaxCode=0x10ffff ,及 std::codecvt_模式=(std::codecvt_模式)0 ),并继承自 标准::编解码器vt<元素、字符、标准::mbstate\u t> .

    codecvt_utf8 and codecvt_utf16 will convert between the specified UTF and either UCS2 or UCS4, depending on the size of Elem . 所以,, 将在16位到31位的系统上指定UCS2(如Windows,16位),或在至少32位的系统上指定UCS4(如Linux,32位),无论 字符串实际上使用这种编码;在使用不同编码的平台上 字符串,如果您不小心,这将导致问题,这是可以理解的。

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

    编解码器 libstdc++ 相对最近。如果使用较旧版本的Clang或GCC,则可能必须使用 libc++ ,如果您想使用它。
    char16\u t ; 如果这些类型存在于以前的版本中,它将作为 unsigned short unsigned int 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