wchar_t在Linux上的UTF-16?

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

我正在尝试使用第三方库,确实如此,这似乎很混乱。 看起来事情是搞砸了,因为在Windows上wchar_t是两个字节,但我只是想仔细检查,因为这是一个非常昂贵的商业图书馆,可能是我只是不明白的东西。

虽然可以在wchar_t存储UTF-16,但是这样的wchar_t值(或者作为字符串使用的数组)不适合与使用wchar_t或指向wchar_t字符串的指针的任何标准函数一起使用。 因此,为了回答你最初的问题“是否有道理??”,我会回答一个明确的不。 你当然可以使用uint16_t ,或者如果可用的话,可以使用C11 char16_t ,但是我没有看到为什么后者更可取,除非你也要使用C11函数来处理它。似乎还没有实施)。

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

Unicode标准定义了基于16位代码单元的默认编码。 这在ICU中由UChar的定义是一个无符号的16位整数类型。 这是ICU中字符串的基本类型。

所以如果你使用ICU,那么你可以使用UChar* 。 如果不是的话, uint16_t会使你的转换更容易,如果你想与UChar进行互操作。

那么,最好的解决方案可能是使用char16_t作为UTF-16,因为这是标准的16位字符类型。 自从gcc 4.4以来,这一点已经得到了支持,所以在大多数你会看到的Linux系统上都应该存在。

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

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