从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
(对于char16_t
使用UCS2,对于char32_t
使用UCS4,对于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
(对于char16_t
使用UCS2,对于char32_t
使用UCS4,对于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
将在Elem
的大小决定下,转换为指定的UTF和UCS2或UCS4之间进行转换。 因此,在它是16到31位(例如Windows系统,其中它是16位)的系统上,wchar_t
将指定UCS2,或者在它至少是32位(例如Linux系统,其中它是32位)的系统上指定UCS4,而不管实际上wchar_t
字符串使用的编码; 在使用不同编码的平台上,如果您不小心,这显然会导致问题。
更多信息,请参阅CPP Reference:
这是一个与编程相关的内容,涉及到std::codecvt
, std::codecvt_utf8
, std::codecvt_utf16
和 std::codecvt_utf8_utf16
。
注意,对于头文件codecvt
的支持仅在相对较近的libstdc++
版本中添加。如果使用较旧版本的Clang或GCC,则可能需要使用libc++
,如果您想使用它。
请注意,2015年之前的版本的Visual Studio实际上不支持char16_t
和char32_t
;如果这些类型存在于以前的版本中,则将作为unsigned short
和unsigned int
的typedef存在。还请注意,旧版的Visual Studio有时可能会在UTF编码之间转换字符串时出现问题,Visual Studio 2015存在一个故障,导致无法正确使用char16_t
和char32_t
的codecvt
,需要改用同等大小的整数类型。