UTF-16编码转换特性

3

这个问题是关于区域设置的延伸。
并在这个问题中描述:我真正想做的是将codecvt facet安装到了解UTF-16文件的locale中。

我可以自己编写。但是我不是一个UTF专家,因此我肯定会几乎正确地编写它,但它会在最不方便的时候出现故障。因此,我想知道是否有任何(网络上的)预构建的codecvt(或其他)facet资源可供从C ++使用,经过同行评审和测试?

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

2个回答

2
我不确定你所说的“网络资源”是否指的是免费提供的,但有一个名为Dinkumware转换库的库似乎可以满足你的需求——前提是该库能够集成到你的编译器套件中。 codecvt类型在代码转换一节中有描述。

1
这些链接现在已经失效了。这些页面是被移动到其他地方了还是完全消失了? - wilx
经过多年的时间,看起来他们已经关闭了对他们库的公共文档的访问。这很遗憾,因为它是一个优秀的学习资源。 - seh

0

从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(对于char16_t使用UCS2,对于char32_t使用UCS4,对于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(对于char16_t使用UCS2,对于char32_t使用UCS4,对于wchar_t使用平台相关)。
    • 具有两个附加的默认模板参数(unsigned long MaxCode = 0x10ffffstd::codecvt_mode Mode = (std::codecvt_mode)0),并继承自std::codecvt<Elem,char,std::mbstate_t>

codecvt_utf8codecvt_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_utf16std::codecvt_utf8_utf16

注意,对于头文件codecvt的支持仅在相对较近的libstdc++版本中添加。如果使用较旧版本的Clang或GCC,则可能需要使用libc++,如果您想使用它。
请注意,2015年之前的版本的Visual Studio实际上不支持char16_tchar32_t;如果这些类型存在于以前的版本中,则将作为unsigned shortunsigned int的typedef存在。还请注意,旧版的Visual Studio有时可能会在UTF编码之间转换字符串时出现问题,Visual Studio 2015存在一个故障,导致无法正确使用char16_tchar32_tcodecvt,需要改用同等大小的整数类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接