【问题标题】:wchar_t for UTF-16 on Linux?Linux 上的 UTF-16 的 wchar_t?
【发布时间】:2012-10-03 15:39:44
【问题描述】:

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

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

【问题讨论】:

  • 可以将 2 字节长的值存储在 4 字节长的变量中...
  • 我认为你需要阅读和理解this
  • 有理由不使用uint16_t 来表示UTF-16 代码单元吗?
  • wchar_t 字符串应该使用实现定义的宽字符编码。如果您的代码假定编码不是它的东西(例如,Linux 上的 UTF-16),那么当该代码尝试与其他正确处理 wchar_t 的代码互操作时可能会出现问题。例如,iconv 无法在 UTF-16-in-4-byte-wchar_t 和 UTF-8 之间正确转换。
  • 如果你想编写可移植的代码,我认为你应该好好看看utf8everywhere.org

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    所以如果你使用 ICU,那么你可以使用UChar*。如果没有,uint16_t 将使您更容易与UChar 互操作。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • OP 说“在 Windows 上 wchar_t 是两个字节”,因此不能适合补充代码点,这表明“它们都适合 wchar_t”并非如此。我同意 UTF-16 是一个糟糕的内部表示选择——它具有 UTF-8(更复杂的迭代)和 UTF-32(大小膨胀)的缺点,但它是像 ICU 这样的标准可以为它制作一个库互操作案例。
        猜你喜欢
        • 2023-03-18
        • 2013-02-26
        • 2012-03-30
        • 2012-06-01
        • 2014-02-07
        • 2013-04-11
        • 2012-01-17
        • 1970-01-01
        • 2013-09-19
        相关资源
        最近更新 更多