关于locales的问题 并在this question中进行了描述:我真正想做的是在熟悉UTF-16文件的语言环境中安装codecvt facet。
我可以写自己的。但我不是UTF专家,因此我相信我会得到它几乎正确;但它会在最不方便的时候破裂。所以我想知道是否有任何可以在C ++中使用的预构建codecvt(或其他)方面的资源(在网上)经过同行评审和测试?
原因是默认语言环境(在我的系统MAC OS X 10.6上)读取文件时只将1个字节转换为1个wchar_t而没有转换。因此,UTF-16编码的文件被转换为包含大量空('\ 0')字符的字符串。
答案 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 = 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
(char16_t
的UCS2,char32_t
的UCS4,wchar_t
的平台相关1}})。
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
(char16_t
的UCS2,char32_t
的UCS4,wchar_t
的平台相关1}})。
unsigned long MaxCode = 0x10ffff
和std::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_t
和char32_t
;如果以前版本中存在这些类型,则它们将分别作为unsigned short
和unsigned 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