角色,代码点,字形和字形之间有什么区别?

Mar*_*ery 116 string unicode terminology

试图理解现代Unicode的微妙之处让我头疼.特别是,代码点,字符,字形和字形之间的区别 - 在最简单的情况下,当使用ASCII字符处理英文文本时,所有这些概念彼此之间都存在一对一的关系 - 这给我带来了麻烦.

看看这些术语如何在像Matthias Bynens的JavaScript这样的文档中使用有一个unicode问题或Wikipedia关于Han统一的文章,我收集到这些概念不是一回事,并且将它们混淆是危险的,但我有点像努力去理解每个术语的含义.

Unicode Consortium提供了一个词汇表来解释这些东西,但它充满了"定义",如下所示:

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

...

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

...

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

...

Grapheme.(1)在特定书写系统的背景下最低限度的独特写作单位....

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

因此,我寻求那些比我学得更多的人的神秘智慧.这些概念中的每一个究竟是如何彼此不同的,在什么情况下它们之间不会有一对一的关系?

Ker*_* SB 182

  • 角色是一个超载的术语,可能意味着很多东西.

  • 码点是信息的原子单位.文本是一系列代码点.每个代码点都是一个由Unicode标准赋予的数字.

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

  • 字形是被显示为一个阅读器识别为书写系统的一个单一的元素的单一的图形单元中的一个或多个码点的序列.例如,两者都是aä字形,但它们可能由多个代码点组成(例如,ä可能是两个代码点,一个用于基本字符,a后面跟一个用于diaresis;但是还有一个替代的,遗留的单个代码点代表这个字形).某些代码点从不是任何字形的一部分(例如,零宽度非连接器或方向覆盖).

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

  • 我刚刚提交了一份编辑,重新排列了代码点和代码单元的顺序。我同意您的观点,即代码单元应该排在第二位。至于“不合时宜”,我怀疑您认为这个答案与我的目的不同。我认为将所有这五个词放在一个地方具有很大的价值。我要说的最后一件事是在Google上搜索“字形,字形,代码单元和代码点之间的区别,并且必须在两个地方得到答案。在很多讨论中,这些术语都在讨论中使用,很少这样做我看到与其他4个讨论,但没有代码单元。 (3认同)
  • @qbolec:这是两个表示单个代码点(U + 1F40A)的UTF-16代码单元,并且鉴于它是一个表情符号,它可能是它自己的单个字素. (3认同)
  • @KerrekSB *“ASCII 是一种编码,就像 Unicode (对数字进行含义分配)一样,但 UTF-? 是其他东西(一种表示数字的方法)”* - 您在这里使用的术语“编码”不匹配我习惯的 - 通常在这个空间中“编码”用于表示将文本的一些抽象概念转换为字节。unicode词汇表中的术语似乎既在你的意义上使用它(例如“编码字符”仍然与字节无关),又在我习惯的意义上使用它(例如“编码方案”是一种映射方案“文本信息”到字节)。 (2认同)
  • @TomPažourek:在分解的规范化中,它由两个代码点(“ a”加“组合变音符号”)表示;在组合规范化中,它由单个代码点(来自旧的传统Latin-1范围的“ä”)表示。Unicode规范化是您要研究的主题,如果您对此感兴趣。在一片空白的世界中,将只有基础角色和组合角色,而没有预建的合成。 (2认同)
  • 您应该为 unicode 编写文档。这比官方文档好多了。 (2认同)
  • *“例如,雪人字形...”* 肯定应该是,*“例如,雪人字形...”*? (2认同)

Poo*_*ick 6

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

Unicode代码点是分配给每个Unicode 字符(可以是字符或字素)的唯一 编号。

不幸的是,Unicode 规则允许一些并置的字素被解释为已经有自己的代码点(预组合形式)的其他字素。这意味着 Unicode 中有多种表示字符的方法。Unicode 规范化解决了这个问题。

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

对马克·埃默里的回复

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

字素和字符哪个更大?人们如何称呼文本中非字母或标点符号的图形元素?我很快想到的一个术语是“字素”。这个词准确地让人联想到“文本中的图形单元”的想法。我提供这样的定义:字素是书面文本中最小的独特组成部分

反过来说,字素是由汉字组成的,那就叫“汉字”,而组成汉字的那些零碎的东西就得叫“汉字”了。然而,这一切都是倒退的。字素是独特的小片段。人物性格更加发达。短语“字形是可组合的”,在 Unicode 上下文中最好表述为“字符是可组合的”。

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

所有这一切都有一个递归元素。在更高的层次上,字素变成字符,变成字素,但向下都是字素。

对TS的回复

该标准的第一章指出:“Unicode 字符编码同等对待字母字符、表意字符和符号,这意味着它们可以以任何混合方式并以相同的便利性使用”。鉴于这一声明,我们应该为标准中的一些术语合并做好准备。有时,只有在标准制定后回顾时,正确的术语才会变得清晰。

在语言的正式定义中,经常会发生两个基本事物相互定义的情况。例如,在 XML中,元素被定义为开始标签,可能后跟内容,最后跟结束标签。内容又被定义为元素、字符数据或其他一些可能的东西。自引用定义的模式也隐含在 Unicode 标准中:

字素是一个代码点或一个字符。

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

当第一次遇到这两个定义时,读者可能会反对第一个定义,因为代码点一个字符,但这并不总是正确的。两个码点的序列有时会在 归一化下编码单个码点,并且该编码码点代表字符,如图 2.7所示。对其他代码点进行编码的代码点序列。这变得有点棘手,我们甚至还没有到达使用UTF-8等字符编码方案将代码点编码为字节序列的层。

在某些情况下,例如关于 变音符号的学术文章,字符的各个部分可能会单独出现在文本中。在这种情况下,单个字符部分可以被视为一个字符,因此 Unicode 标准保持灵活性也是有道理的。

正如马克·艾弗里(Mark Avery)指出的那样,一个角色可以组合成一个更复杂的事物。也就是说,如果需要,每个字符都可以充当字素。所有合成的最终结果是“用户认为是角色”的东西。无论是在标准中还是在本次讨论中,似乎都没有任何真正的阻力,即在最高级别上,用户将文本中的这些内容视为单个字符。为了避免该术语重载,我们可以在所有想要引用用于组成字符的部分的情况下使用“字素”。

有时,Unicode 标准及其术语随处可见。例如,第 3 章 将 UTF-8 定义为“编码形式”,而术语表将“编码形式”定义为其他内容,将 UTF-8 定义为“字符编码方案”。另一个例子是“Grapheme_Base”和“Grapheme_Extend”,它们被认为是错误,但仍然存在,因为清除它们是一项艰巨的任务。加强该标准所使用的术语仍有工作要做。

添加 COMBINING GRAPHEME JOINER 的提案在指出“字素是一个或多个编码字符的序列,与用户所认为的字符相对应”时犯了错误。它应该改为:“一个或多个字素的序列组成了用户认为的字符。” 然后它可以使用与术语“字符序列”不同的术语“字素序列”。这两个术语都很有用。“字素序列”巧妙地暗示了从较小的部分构建字符的过程。“字符序列”的意思是我们通常凭直觉理解的意思:“用户认为是字符的一系列事物。”

有时,程序员确实希望在字素序列级别进行操作,因此应该有检查和操作这些序列的机制,但通常,在处理文本时,对“字符序列”(用户认为的字符序列)进行操作就足够了作为一个角色)并让系统管理较低级别的细节。

在本讨论到目前为止涵盖的每种情况下,使用“字素”来指代不可分割的组件,使用“字符”来指代组合实体会更清晰。这种用法也更好地反映了这两个术语长期以来的含义。

  • @DavidKlempfner http://www.eeemo.net/。它基本上会在您输入的文本中添加大量的重音符号和类似的修饰符。 (4认同)
  • 谨慎-1;我*认为*这是错误的。您暗示一个字符可以由许多字素组成,但始终由单个字形表示;我认为事实上恰恰相反。像 https://en.wikipedia.org/wiki/N-diaeresis 这样的页面表明,字母与变音符号(至少一个改变其含义的变音符号)的组合形成了一个独特的新字素,​​并且变音符号不是字素在其自己的。同时,字形显然是可组合的 s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼ ̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥ (2认同)
  • 我很欣赏刚刚看到的回复。然而,我仍然认为你对字素的定义实际上是不正确的,或者至少与 *Unicode* 定义这个词的方式不一致。您驳回了由字符组成的字素的想法,因为它是“全部向后”,但我做了一些挖掘,发现http://www.unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm 其中从字面上看,开头是“字素是一个或多个编码字符的序列”*。 (2认同)