5

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

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

4

4 回答 4

7

虽然可以将 UTF-16 存储在 中wchar_t,但此类wchar_t值(或用作字符串的数组)不适合与任何采用wchar_t或指向wchar_t字符串的标准函数一起使用。因此,要回答您最初的“这有意义吗……?”的问题,我会以明确的否定回答。你当然可以使用uint16_t这个目的,或者char16_t如果 C11 可用的话,虽然我看不出有任何理由为什么后者会更可取,除非你也打算使用 C11 函数来处理它(而且它们似乎没有尚未实施)。

于 2012-10-12T20:03:09.200 回答
3

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

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

因此,如果您使用 ICU,那么您可以使用UChar*. 如果没有,如果uint16_t您想与UChar.

于 2012-10-12T19:21:41.163 回答
1

好吧,最好的解决方案可能是使用char16_tUTF-16,因为这是标准的 16 位字符类型。从 gcc 4.4 开始就已支持此功能,因此应该存在于您将看到的大多数 Linux 系统上。

于 2012-10-12T19:47:10.403 回答
0

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

无论如何,UTF-16 是比其他任何东西都更糟糕的折衷方案,并且永远不应该使用。要么使用 UTF-8(在大多数情况下效率更高,也更常用),要么使用 wchar_t[]。

于 2012-10-12T20:34:04.723 回答