首页 文章

UTF-16 codecvt方面

提问于
浏览
3

关于locales的问题扩展
并在_2559335中描述:我真正想要做的是在熟悉UTF-16文件的语言环境中安装codecvt facet .

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

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

2 回答

  • 0

    我不确定是否"resources on the Web"你的意思是免费的,但是Dinkumware Conversions Library听起来它会满足你的需求 - 只要你的库可以集成到你的编译器套件中 .

    codecvt 类型在Code Conversions部分中描述 .

  • 2

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

    <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表示 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> .

    • 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参考:

    请注意,对头文件编解码器的支持最近才添加到libstdc中 . 如果使用较旧版本的Clang或GCC,则可能必须使用libc(如果要使用它) . 请注意,2015之前的Visual Studio版本实际上不支持char16_t和char32_t;如果以前版本中存在这些类型,则它们将分别作为unsigned short和unsigned int的typedef . 另请注意,旧版本的Visual Studio有时可能无法在UTF编码之间转换字符串,并且Visual Studio 2015有一个小故障会阻止codecvt与char16_t和char32_t一起正常工作,需要使用相同大小的整数类型

相关问题