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表包含替换和定位信息以使其工作.字体也可以包含同一字素的多个替代字形.
在 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 的提案在指出“字素是一个或多个编码字符的序列,与用户所认为的字符相对应”时犯了错误。它应该改为:“一个或多个字素的序列组成了用户认为的字符。” 然后它可以使用与术语“字符序列”不同的术语“字素序列”。这两个术语都很有用。“字素序列”巧妙地暗示了从较小的部分构建字符的过程。“字符序列”的意思是我们通常凭直觉理解的意思:“用户认为是字符的一系列事物。”
有时,程序员确实希望在字素序列级别进行操作,因此应该有检查和操作这些序列的机制,但通常,在处理文本时,对“字符序列”(用户认为的字符序列)进行操作就足够了作为一个角色)并让系统管理较低级别的细节。
在本讨论到目前为止涵盖的每种情况下,使用“字素”来指代不可分割的组件,使用“字符”来指代组合实体会更清晰。这种用法也更好地反映了这两个术语长期以来的含义。
| 归档时间: |
|
| 查看次数: |
20654 次 |
| 最近记录: |