wchar_t for Linux上的UTF-16?

时间:2012-10-12 19:09:44

标签: c linux unicode utf-16 wchar-t

在Linux上使用wchar_t*存储UTF-16编码文本是否有意义?显而易见的问题是wchar_t在Linux上是四个字节,而UTF-16通常每个字符需要两个(有时是两组)两个字节。

我正在尝试使用完全相同的第三方库,这似乎非常令人困惑。看起来事情搞砸了,因为在Windows上wchar_t是两个字节,但我只想仔细检查,因为它是一个相当昂贵的商业库,可能我只是不明白。

4 个答案:

答案 0 :(得分:6)

虽然可以在wchar_t中存储UTF-16,但是这些wchar_t值(或者用作字符串的数组)不适合用于{{1}的任何标准函数}或指向wchar_t字符串的指针。因此,为了回答你最初的问题“它是否有意义......?”,我会回答一个明确的否定。当然,您可以使用wchar_t或者C11 uint16_t(如果可用),但我没有看到任何理由为什么后者会更好,除非您还要使用C11函数处理它(它们似乎还没有实现)。

答案 1 :(得分:3)

http://userguide.icu-project.org/strings

  

Unicode标准定义了基于16位代码单元的默认编码。 ICU通过定义UChar为无符号16位整数类型来支持这一点。这是ICU中字符串的字符数组的基本类型。

因此,如果您使用ICU,则可以使用UChar*。如果不是,uint16_t如果您希望与UChar互操作,则可以更轻松地进行转换。

答案 2 :(得分:1)

嗯,最好的解决方案可能是将char16_t用于UTF-16,因为那是标准的16位字符类型。自gcc 4.4以来一直支持这一点,因此应该出现在大多数Linux系统上。

答案 3 :(得分:0)

不,解码UTF-16并将其存储在wchar_t数组中是有意义的。并非所有Unicode代码点都只有一个UTF-16中的16位字,但它们都适合wchar_t。

在任何情况下,UTF-16都是比其他任何东西更糟糕的妥协,绝不应该使用。使用UTF-8(在大多数情况下更常用,也更常用),或者使用wchar_t []。