【问题标题】:Is there name for smallest unit of UTF-8 string?UTF-8 字符串的最小单位有名称吗?
【发布时间】:2014-11-02 13:26:47
【问题描述】:

我正在移植一个不支持 Unicode 的应用程序。我选择 UCS4 作为内部表示,以通过重用现有代码库来简化字符串处理,因为我感兴趣的应用程序不执行与字素或可视集群管理相关的任务,并且可能仅在代码点上运行,因此现在可以负担得起。

现有应用程序到处都使用char *,因此在此过程中,我建立了几个类型来替换所有这些情况下使用的char *,并且不再明确使用char *

  1. “纯字节,可能包含零并带有长度”。我将这些描述为typedef uint8_t byte_t 并用作byte_t *foo。它是char * 的直接替代品,兼容接受void *char * 的函数。
  2. “Unicode 字符串的大部分以 null 结尾的字符” — 这些是 typedef uint32_t ucs4char_t。我通过 strnlen_ucs4(const ucs4char_t *s, size_t maxlen) 等自己的函数处理此类字符,这些函数重新实现了原始函数的逻辑,但对整个 UCS4 代码点而不是 8 位字符进行操作。
  3. 最后,“作为 UTF-8 编码字符串一部分的字节,不代表特定字符/代码点,暗示以零结尾,用作不透明缓冲区”——我遇到了麻烦用这个命名。在功能上它与byte_t 相同,但我想强调这些类型有不同的用途,不应该在没有明确翻译的情况下混合使用(尽管在这种特殊情况下翻译是无操作的)。这些单元出现在 Unicode 世界和 OS/network/fs/whatever 之间的“边界”函数中,它们需要将 UCS4 强制转换为 OS 提供的不透明零终止字符串(以 getenv()/putenv() 为例) .我将 UCS4 编码为 UTF8,因此我可以使用 strlenstrncmp,它们不必关心 Unicode 和比较内容的含义

但是我不知道这么小的单位有没有正式的名字,所以现在我叫它utf8byte_t,感觉用词不当。

那么,有什么名字可以用吗?如果没有,也许有更好的方法来解决我所描述的问题?

【问题讨论】:

  • rfc 3629 只是将其称为八位字节。
  • @nos,这可能是有道理的,但命名为 octet 几乎与 byte 一样通用。但是,Freenode 用户 @ihatehex 建议将它们命名为 tribble,这听起来不错,而且很吸引人:)
  • 我只会打电话给前者char。后者在 UTF-8 的 Plan 9 实现中称为Rune,是原始的。其他操作系统的端口是available under a liberal license
  • types ending with "_t" 被某些编译器保留 - 可能想要使用不同的方案。
  • 您要求为模糊描述的事物提供正式名称,这种方式混淆了一般 Unicode 概念和特定编程语言。官方到底是谁what?此外,因此,整个问题都是题外话,因为它是关于术语的,而不是一个实用的、可回答的程序问题。

标签: c unicode utf-8 naming-conventions naming


【解决方案1】:

把东西放在一起。

Unicode 字符串由代码点组成。代码点只是一个开放范围[0..0x110000) 中的数字,并且没有定义的二进制表示。 UCS4 允许将代码点表示为至少 32 位无符号整数,但 用于内存中,因为UCS4 中没有定义二进制表示。或者,UCS2 将代码点表示为 16 位无符号整数,但会将代码空间截断为开放范围 [0..0x10000)基本平面),从而无法在补充平面中表达字符时间>。 UCS2 显然是 UCS4 的子集,而 UCS2 也没有定义二进制表示。

这就是 Unicode 转换格式(UTF-8、UTF-16 和 UTF-32)的用途。他们定义了将每个代码点翻译成一个或多个代码单元的规则,这些二进制表示。

UTF-32 将每个代码点转换为单个 32 位长代码单元。

UTF-16 将每个代码点映射到一个或两个代码单元,每个 16 位。两个 UTF-16 代码单元形成 代理对,然后可以将其解码为单个代码点。代理对用于辅助平面中的字符(UCS2 无法支持的)。

UTF-8 将每个代码点映射到最多四个(在旧 Unicode 标准中最多六个)代码单元,每个代码单元正好是 8 位。


所以对于我的特殊情况,我应该将此类型命名为utf8codeunit_t。我不能将其命名为codeunit_t,因为代码单元仅在其各自的转换格式范围内定义。除了“UTF-xx 编码的代码点”之外,我仍然不知道 代码单元 编码单个 代码点 的序列是否有名称,但这并不重要。

【讨论】:

  • OP 可能不知道的一件事:UTF-32 代码单元不一定对应一个“字符”
  • @rubenvb 我是,正如我在我的问题中明确指出的那样,我正在开发的软件在字形或视觉集群方面不进行文本处理。所以我不关心控制字符、组合字符等等——代码点是我任务的最高必要抽象级别。但是感谢您的建议,这可能对某人来说是个问题。
猜你喜欢
  • 2013-04-26
  • 2011-06-17
  • 1970-01-01
  • 2019-07-30
  • 2016-10-18
  • 1970-01-01
  • 2011-06-22
  • 2018-06-29
  • 2015-09-01
相关资源
最近更新 更多