关于locales的问题扩展
并在_2559335中描述:我真正想要做的是在熟悉UTF-16文件的语言环境中安装codecvt facet .
我可以写自己的 . 但我不是UTF专家,因此我相信我会得到它几乎正确;但它会在最不方便的时候破裂 . 所以我想知道是否有任何可以在C中使用的预构建codecvt(或其他)方面的资源(在网上)经过同行评审和测试?
原因是默认语言环境(在我的系统MAC OS X 10.6上)读取文件时只将1个字节转换为1个wchar_t而没有转换 . 因此,UTF-16编码的文件被转换为包含许多空('\ 0')字符的字符串 .
2 回答
我不确定是否"resources on the Web"你的意思是免费的,但是Dinkumware Conversions Library听起来它会满足你的需求 - 只要你的库可以集成到你的编译器套件中 .
codecvt
类型在Code Conversions部分中描述 .从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 = 0x10ffff
和std::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 = 0x10ffff
和std::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 = 0x10ffff
和std::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参考:
std::codecvt
std::codecvt_utf8
std::codecvt_utf16
std::codecvt_utf8_utf16
请注意,对头文件编解码器的支持最近才添加到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一起正常工作,需要使用相同大小的整数类型