在Linux上使用wchar_t*
存储UTF-16编码文本是否有意义?显而易见的问题是wchar_t
在Linux上是四个字节,而UTF-16通常每个字符需要两个(有时是两组)两个字节。
我正在尝试使用完全相同的第三方库,这似乎非常令人困惑。看起来事情搞砸了,因为在Windows上wchar_t
是两个字节,但我只想仔细检查,因为它是一个相当昂贵的商业库,可能我只是不明白。
答案 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 []。