【问题标题】:What's the difference between a character, a code point, a glyph and a grapheme?字符、代码点、字形和字形之间有什么区别?
【发布时间】:2015-02-04 13:31:25
【问题描述】:

试图理解现代 Unicode 的微妙之处让我头疼。特别是代码点、字符、字形和字形之间的区别——在最简单的情况下,当使用 ASCII 字符处理英文文本时,它们之间都具有一对一的关系- 给我添麻烦了。

看到这些术语如何在诸如 Matthias Bynens 的 JavaScript has a unicode problem 或维基百科在 Han unification 上的文章中使用,我发现这些概念不是一回事,将它们混为一谈很危险,但我认为有点难以理解每个术语 的含义

Unicode 联盟提供了一个glossary 来解释这些东西,但它充满了这样的“定义”:

抽象字符。用于组织、控制或表示文本数据的信息单元。 ...

...

字符。 ... (2) 抽象字符的同义词。 (3) Unicode 字符编码的基本编码单位。 ...

...

字形。 (1) 代表一个或多个字形图像的抽象形式。 (2) 字形图像的同义词。在显示 Unicode 字符数据时,可以选择一个或多个字形来描绘特定字符。

...

字形。 (1) 在特定书写系统的上下文中,最小的独特书写单元。 ...

这些定义中的大多数都具有听起来非常学术和正式的质量,但缺乏有意义的质量,或者将定义问题推迟到另一个词汇表条目或标准部分。

所以我寻求那些比我更有学问的人的神秘智慧。这些概念中的每一个究竟有何不同,在什么情况下它们不会彼此建立一对一的关系?

【问题讨论】:

  • 对于许多不同的语言,有许多非常不同的书写系统。因此,对于写作的问题,众说纷纭,背后也有着悠久的历史。恕我直言,记住这一点很有用,因为 Unicode 试图涵盖一切。 (草书是相同还是不同的字符?汉字部首?韩文?变音符号?肤色表情符号??...)

标签: string unicode terminology


【解决方案1】:
  • 字符是一个重载的术语,可以表示很多东西。

  • 代码点是信息的原子单位。 Text 是一系列代码点。每个代码点都是一个数字,由 Unicode 标准赋予含义。

  • 代码单元是编码代码点的部分的存储单元。在 UTF-8 中这意味着 8 位,在 UTF-16 中这意味着 16 位。单个代码单元可以表示完整的代码点或代码点的一部分。例如,雪人字形 () 是一个代码点,但有 3 个 UTF-8 代码单元和 1 个 UTF-16 代码单元。

  • grapheme 是一个或多个代码点的序列,这些代码点显示为单个图形单元,读者将其识别为书写系统的单个元素。例如,aä 都是字形,但它们可能由多个代码点组成(例如,ä 可能是两个代码点,一个用于基本字符 a,然后一个用于分音符号;但有也是代表这个字素的替代的、遗留的、单一的代码点)。某些代码点绝不是任何字素的一部分(例如,零宽度非连接符或方向覆盖)。

  • glyph 是一个图像,通常存储在 font(它是字形的集合)中,用于表示字形或其部分。字体可以将多个字形组合成单个表示,例如,如果上面的ä 是单个代码点,则字体可以选择将其呈现为两个独立的、空间重叠的字形。对于 OTF,字体的 GSUB 和 GPOS 表包含替换和定位信息以使其工作。一个字体也可以包含同一个字素的多个替代字形。

【讨论】:

  • @KerrekSB “ASCII 和 Unicode 一样是一种编码(给数字赋予意义),但 UTF-? 是另外一种(表示数字的方法)” -您在这里对术语“编码”的使用与我习惯的不符 - 通常在这个空间中,“编码”用于表示将文本的一些抽象概念转换为字节。 unicode 词汇表中的术语似乎在您的意义上使用它(例如,“编码字符”仍然与字节无关)和我习惯使用的术语(例如,“编码方案”是一种映射方案“文本信息”转换为字节)。
  • 我刚刚提交了重新安排代码点和代码单元顺序的编辑。我同意你的观点,代码单元应该排在第二位。至于“不合时宜”,我怀疑您认为此答案与我的目的不同。我认为将所有 5 个术语集中在一个地方具有很大的价值。我想要的最后一件事是谷歌“字形,字形,代码单元和代码点之间有什么区别,并且必须在两个地方得到答案。在很多讨论中,这些术语都在讨论中使用,很少这样做我看到了与其他 4 人的讨论,但没有看到代码单元。
  • 例如'\uD83D\uDC0A'(显示鳄鱼表情符号)代码点、字形等是什么?特别是,它与.length.codePointAt(0).codePointAt(1).charCodeAt(0).charCodeAt(1) 结果有什么关系?
  • @qbolec:这是两个 UTF-16 代码单元,表示单个代码点 (U+1F40A),鉴于它是一个表情符号,它可能是它自己的单个字素。
  • @TomPažourek:在分解的规范化中,它由两个代码点表示(a 加上“组合变音符号”);在组合规范化中,它由单个代码点表示(来自旧的旧式 Latin-1 范围的ä)。如果您对此感兴趣,Unicode 规范化是您想要研究的主题。在一个空白的世界中,只有基本字符和组合字符,没有预构建的组合。
【解决方案2】:

在 Unicode 标准之外,字符是由一个或多个 graphemes 组成的单个文本单元。 Unicode 标准定义为“字符”实际上是字形和字符的混合。 Unicode 提供了将并列字素解释为单个字符的规则。

Unicode code point 是分配给每个 Unicode character 的唯一编号(可以是字符或字素)。

不幸的是,Unicode 规则允许一些并列的字素被解释为已经有自己的代码点的其他字素 (precomposed forms)。这意味着在 Unicode 中有不止一种方式来表示一个字符。 Unicode normalization 解决了这个问题。

字形是字符的视觉表示。字体为特定字符集(不是 Unicode 字符)提供一组字形。对于每个字符,都有无数可能的字形。

回复马克·艾默里

首先,正如我所说,每个字符都有无数可能的字形,所以不,一个字符不是“总是由一个字形表示”。 Unicode 本身不太关心字形,它在代码图表中定义的东西肯定不是字形。问题是他们也不是所有角色。那么它们是什么?

哪个是更大的实体,字形还是字符?人们如何称呼文本中不是字母或标点符号的图形元素?一个很快浮现在脑海中的术语是“字形”。这个词准确地让人联想到“文本中的图形单元”的概念。我给出了这样的定义:字素是书面文本中最小的不同组成部分

可以反过来说,字形是由字组成的,那么就叫“汉字”,而汉字所组成的那些点点滴滴,都得叫“字”。然而,这一切都倒退了。字素是不同的点点滴滴。人物更加发达。短语“字形是可组合的”,在 Unicode 的上下文中更好地表述为“字符是可组合的”。

Unicode 定义了字符,但它也定义了要与其他字素或字符组合的字素。你创作的那些怪物就是一个很好的例子。如果他们流行起来,也许他们会在更高版本的 Unicode 中获得自己的代码点;)

这一切都有一个递归元素。在更高的级别,字素变成字符变成字素,但它一直是字素。

对 T S 的回复

Chapter 1 的 标准规定:“Unicode 字符编码处理字母字符, 表意字符和符号等价,这意味着它们可以使用 在任何混合和同等便利的情况下”。鉴于这种说法,我们应该 为标准中的一些术语的合并做准备。有时适当的 随着标准的发展,术语只有在回顾时才会变得清晰。

在语言的正式定义中经常出现两个基本 事物是相互定义的。例如,在 XML 一个元素被定义为起始标签 可能后跟内容,后跟结束标记。内容定义在 turn 作为元素、字符数据或其他一些可能的东西。一种 自引用定义的模式也隐含在 Unicode 中 标准:

字素是代码点或字符。

一个字符由一个或多个字素的序列组成。

当第一次遇到这两个定义时,读者可能会反对 第一个定义是基于代码点一个字符,但是 这并不总是正确的。一个由两个代码点组成的序列有时会编码一个 下的单个代码点 normalization,那 编码的代码点表示字符,如图所示 figure 2.7。序列 编码其他代码点的代码点。这变得有点棘手 我们甚至还没有达到字符编码方案这样的层 正如UTF-8 用于 将代码点编码为字节序列。

在某些情况下,例如一篇关于 diacritics 和个人 字符的一部分可能会单独出现在文本中。在这种情况下, 单个字符部分可以被认为是一个字符,所以它是有道理的 Unicode 标准也保持灵活。

正如 Mark Avery 所指出的,一个角色可以组合成一个更复杂的 事物。也就是说,如果需要,每个字符都可以用作字素。这 所有组合的最终结果是“用户认为 性格”。似乎没有任何真正的阻力,无论是在 标准或在此讨论中,认为在最高级别有 用户认为文本中的这些内容是单个字符。到 避免重载该术语,我们可以在所有需要的情况下使用“字形” 指用于组成角色的部分。

有时,Unicode 标准的术语无处不在。为了 例如,Chapter 3 将 UTF-8 定义为“编码形式”,而词汇表定义了“编码 形式”作为其他东西,而 UTF-8 作为“字符编码方案”。另一个 例如“Grapheme_Base”和“Grapheme_Extend”,are acknowledged 是 错误,但仍然存在,因为清除它们是一项任务。有 仍需努力收紧该标准使用的术语。

Proposal for addition of COMBINING GRAPHEME JOINER 知道了 当它说“字素是一个或多个编码的序列时,它是错误的 与用户认为的字符相对应的字符。”它应该 而是阅读,“一个或多个字素的序列组成了用户 认为是一个字符。”然后它可以使用术语“字素序列” 与术语“字符序列”截然不同。这两个术语都很有用。 “字素序列”巧妙地暗示了从 较小的碎片。 “字符序列”是指我们通常直觉的 意思是:“用户认为是字符的一系列事物。”

有时程序员确实想在字素级别进行操作 序列,因此检查和操作这些序列的机制应该是 可用,但一般来说,在处理文本时,操作就足够了 “字符序列”(用户认为的字符)并让 系统管理底层细节。

到目前为止,在本讨论中涉及的所有情况下,使用“字形”会更简洁 指不可分割的组成部分,“字符”指组合的 实体。这种用法也更好地反映了两者的长期含义 条款。

【讨论】:

  • 谨慎-1;我认为这是错误的。您暗示一个字符可以由许多字素组成,但总是由一个字形表示;我认为实际上情况正好相反。像en.wikipedia.org/wiki/N-diaeresis 这样的页面表明,字母与变音符号(至少改变其含义)的组合形成了一个独特的新字形,而变音符号本身并不是一个字形。同时,字形是显然可协彩的s͈̘̻̗̝İn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯̥̖̮̫̣̯i̪͉̜̼̼̣̟̣̰̟̥̞̹̰̟̥̞̹̪̭̹̝̙̹̼̦̞̙̺̳̟̙̺̳̟̤̗̘̭̙̪̦̬̜̺̬̝̺̖̗̩̺̖̗̩̟̟s̹̹.̯̖̝̯̟̜̥̯̖̝̯̟̜̥̹.̯̖̝̯̟̜̥̯̖̝̯̟̜̥̹.̯̖̝̯̟̜̥̯̖̝̯̟̜̥̹̹.̯̖̝̯̟̜̥̯̖̝̯̟̜̥̹̹.̯̖̝̯̟̜̥̯̖̝̯̟̜̥
  • 感谢我刚刚看到的回复。但是,我仍然认为您对字素的定义实际上是不正确的,或者至少与 Unicode 对单词的定义不一致。您认为字素由字符组成的想法是“全部向后”,但我做了一点挖掘,发现unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm 字面上以声明开头“字素是一个或多个编码字符的序列”.
  • @PoorYorick 你声称,“......一个字符是由一个或多个字素组成的单个文本单元”和“字素是不同的点点滴滴。字符更加发达”。您是否有任何支持这些主张的参考资料?因为我不知何故怀疑,Unicode 联盟故意决定以某种方式“颠倒”定义他们的名字。
  • @PoorYorick 我理解你的意思,在你添加这个进一步的解释之前,这不是我问的原因。我只是要求提供参考资料(词典、科学文章、技术标准……),因为我不知道任何使用字形解释方式的文档。 (字素的前几个谷歌结果也没有以你的方式使用这个词)。您添加了一个块引用“字形是代码点或字符。[...]” - 但它来自哪里?最后你说“这两个术语的长期含义”。 - 如果它已经建立然后链接到某个东西,那就是这样使用术语。
  • @DavidKlempfner eeemo.net。它基本上会在您输入的文本中添加大量的重音和类似的修饰符。
猜你喜欢
  • 1970-01-01
  • 2018-11-12
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2011-11-13
  • 2020-02-04
相关资源
最近更新 更多