提问人:Mark Amery 提问时间:12/6/2014 最后编辑:Mark Amery 更新时间:11/17/2023 访问量:54541
字符、码位、字形和字素之间有什么区别?
What's the difference between a character, a code point, a glyph and a grapheme?
问:
试图理解现代Unicode的微妙之处让我头疼。特别是,代码点、字符、字形和字素之间的区别——在最简单的情况下,当使用 ASCII 字符处理英语文本时,这些概念彼此之间都有一对一的关系——这给我带来了麻烦。
看到这些术语是如何在文档中使用的,比如 Matthias Bytens 的 JavaScript 有一个 unicode 问题,或者维基百科关于汉族统一的文章,我发现这些概念不是一回事,将它们混为一谈是危险的,但我有点难以理解每个术语的含义。
Unicode 联盟提供了一个词汇表来解释这些东西,但它充满了这样的“定义”:
抽象字符。用于组织、控制或表示文本数据的信息单元。...
...
性格。...(2)抽象字符的同义词。(3)Unicode字符编码的基本编码单位。...
...
字形。(1) 表示一个或多个字形图像的抽象形式。(2)字形图像的同义词。在显示 Unicode 字符数据时,可以选择一个或多个字形来描述特定字符。
...
字形。(1) 在特定书写系统上下文中具有最低限度特征的书写单位。...
这些定义中的大多数都具有听起来非常学术和正式的品质,但缺乏任何含义的质量,或者将定义问题推迟到标准的另一个词汇表条目或部分。
因此,我寻求那些比我更有学问的人的神秘智慧。这些概念中的每一个究竟有何不同,在什么情况下它们之间不会有一对一的关系?
答:
性格是一个超载的术语,可能意味着很多事情。
代码点是信息的原子单位。文本是一系列代码点。每个码位都是一个数字,由 Unicode 标准赋予含义。
代码单元是编码代码点的一部分的存储单元。在 UTF-8 中,这意味着 8 位,在 UTF-16 中,这意味着 16 位。单个代码单元可以表示一个完整的代码点,也可以表示一个代码点的一部分。例如,雪人字形 () 是单个代码点,但有 3 个 UTF-8 代码单元和 1 个 UTF-16 代码单元。
☃
字素是一个或多个代码点的序列,这些代码点显示为单个图形单元,读者将其识别为书写系统的单个元素。例如,两者都是字素,但它们可能由多个码位组成(例如 可以是两个码位,一个用于基本字符,一个用于 diaeresis;但还有一个替代的、遗留的、表示这个字形的单一代码点)。有些码位从来都不是任何字素的一部分(例如,零宽度非连接器或方向覆盖)。
a
ä
ä
a
字形是一种图像,通常以字体(字形的集合)存储,用于表示字素或其部分。字体可以将多个字形组合成一个表示形式,例如,如果上面是单个代码点,则字体可以选择将其呈现为两个单独的、空间覆盖的字形。对于 OTF,字体的 GSUB 和 GPOS 表包含替换和定位信息,以便完成此操作。一种字体也可能包含同一字形的多个替代字形。
ä
评论
a
ä
在Unicode标准之外,字符是由一个或多个字素组成的单个文本单元。Unicode标准所定义的“字符”实际上是字素和字符的混合体。Unicode 提供了将并列字素解释为单个字符的规则。
Unicode 码位是分配给每个 Unicode 字符(字符或字素)的唯一编号。
不幸的是,Unicode 规则允许将一些并列的字素解释为已经拥有自己的码位(预组合形式)的其他字素。这意味着 Unicode 中有多种方式来表示字符。Unicode 规范化解决了此问题。
字形是字符的视觉表示。字体为一组特定的字符(不是 Unicode 字符)提供一组字形。对于每个字符,都有无限数量的可能字形。
对 Mark Amery 的回复
首先,正如我所说,每个字符都有无限数量的可能字形,所以不,一个字符不是“总是由单个字形表示”。Unicode不太关心字形,它在代码图表中定义的东西当然不是字形。问题是它们也不都是角色。那么它们是什么?
哪个是更大的实体,字素还是字符?文本中那些不是字母或标点符号的图形元素怎么称呼?一个很快浮现在脑海中的术语是“字形”。这个词准确地让人联想到“文本中的图形单元”的概念。我给出这个定义:字素是书面文本中最小的不同组成部分。
人们可以反过来说字素是由字符组成的,但它们将被称为“中文字素”,而中国字素所组成的所有这些零碎的东西都必须被称为“字符”。然而,这都是倒退的。字素是独特的小点滴滴。角色更加发达。短语“字形是可组合的”,在Unicode的上下文中最好表述为“字符是可组合的”。
Unicode 定义了字符,但它也定义了要与其他字素或字符组成的字素。你创作的那些怪物就是一个很好的例子。如果他们流行起来,也许他们会在更高版本的 Unicode ;)中获得自己的代码点
所有这些都有一个递归元素。在更高的层次上,字素变成了字符,变成了字素,但它一直都是字素。
对 T S 的回复
第 1 章 标准规定:“Unicode 字符编码处理字母字符, 表意字符和等效符号,这意味着它们可以使用 在任何混合物中,并具有同等的设施”。鉴于这一说法,我们应该 为标准中的一些术语混合做好准备。有时适当的 术语只有在回想起来时才会随着标准的发展而变得清晰。
它经常发生在一种语言的正式定义中,即两个基本 事物是根据彼此来定义的。例如,在 XML 中,元素被定义为起始标记 可能后跟内容,后跟结束标签。内容定义在 turn 作为元素、字符数据或其他一些可能的东西。一个 自引用定义的模式也隐含在 Unicode 中 标准:
字素是一个码位或字符。
字符由一个或多个字素序列组成。
当第一次面对这两个定义时,读者可能会反对 第一个定义是基于代码点是一个字符,但是 这并不总是正确的。由两个代码点组成的序列有时会对 规范化下的单个码位,并且 编码的码位表示字符,如图 2.7 所示。序列 对其他代码点进行编码的代码点。这有点棘手, 我们甚至还没有到达字符编码方案这样的层 因为 UTF-8 习惯于 将代码点编码为字节序列。
在某些情况下,例如一篇关于变音符号的学术文章,以及个人 字符的一部分可能会单独显示在文本中。在这种情况下, 单个角色部分可以被视为一个角色,所以这是有道理的 Unicode标准也保持灵活性。
正如马克·艾弗里(Mark Avery)所指出的,一个角色可以组成一个更复杂的角色 东西。也就是说,如果需要,每个字符都可以用作字素。这 所有组合的最终结果是“用户认为是 字符”。似乎没有任何真正的阻力,在 标准或在此讨论中,认为在最高级别有 文本中的这些内容,用户将其视为单个字符。自 避免重载该术语,我们可以在需要的所有情况下使用“字形” 指用于构成角色的部分。
At times the Unicode standard is all over the place with its terminology. For example, Chapter 3 defines UTF-8 as an "encoding form" whereas the glossary defines "encoding form" as something else, and UTF-8 as a "Character Encoding Scheme". Another example is "Grapheme_Base" and "Grapheme_Extend", which are acknowledged to be mistakes but that persist because purging them is a bit of a task. There is still work to be done to tighten up the terminology employed by the standard.
The Proposal for addition of COMBINING GRAPHEME JOINER got it wrong when it stated that "Graphemes are sequences of one or more encoded characters that correspond to what users think of as characters." It should instead read, "A sequence of one or more graphemes composes what the user thinks of as a character." Then it could use the term "grapheme sequence" distinctly from the term "character sequence". Both terms are useful. "grapheme sequence" neatly implies the process of building up a character from smaller pieces. "character sequence" means what we all typically intuit it to mean: "A sequence of things the user thinks of as characters."
Sometimes a programmer really does want to operate at the level of grapheme sequences, so mechanisms to inspect and manipulate those sequences should be available, but generally, when processing text, it is sufficient to operate on "character sequences" (what the user thinks of as a character) and let the system manage the lower-level details.
In every case covered so far in this discussion, it's cleaner to use "grapheme" to refer to the indivisible components and "character" to refer to the composed entity. This usage also better reflects the long-established meanings of both terms.
评论
At least as far as Unicode is concerned, this is all on the FAQ.
https://www.unicode.org/faq/char_combmark.html
And explained much more concisely and clearly the I or anyone else above has explained it.
🫳🎤. ☮️
下一个:字符串文本和数组的地址
评论