wchar_t*
在 Linux上存储 UTF-16 编码的文本是否有意义?明显的问题是wchar_t
在 Linux 上是四个字节,而 UTF-16 通常每个字符占用两个(或有时两组两个)字节。
我正在尝试使用可以完全做到这一点的第三方库,这似乎很令人困惑。看起来事情搞砸了,因为在 Windows 上wchar_t
是两个字节,但我只是想仔细检查一下,因为它是一个非常昂贵的商业库,可能我只是不明白一些东西。
虽然可以将 UTF-16 存储在 中wchar_t
,但此类wchar_t
值(或用作字符串的数组)不适合与任何采用wchar_t
或指向wchar_t
字符串的标准函数一起使用。因此,要回答您最初的“这有意义吗……?”的问题,我会以明确的否定回答。你当然可以使用uint16_t
这个目的,或者char16_t
如果 C11 可用的话,虽然我看不出有任何理由为什么后者会更可取,除非你也打算使用 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[]。