为什么Unicode中存在重复字符?

6

我在Unicode中看到一些重复的字符。例如,字符'C'可以用代码点U+0043和U+0421表示。为什么会这样呢?

5个回答

20

正如其他人所指出的,你在这里的主要谬误是混淆了拉丁和西里尔文字母以及其中一些字形(即 C(U+0043 LATIN CAPITAL LETTER C)和 С(U+0421 CYRILLIC CAPITAL LETTER ES))。有许多这样看起来相似但实际上是不同字符的字符对。例如,在拉丁文、希腊文和西里尔文中,大部分时间它们只能用于大写或小写。

然而,事实上确实存在重复的情况,有时是故意为之。例如,在 U+FF00 和 U+FFEF 之间的“半角和全角字符”Unicode 块中,整个(ASCII)拉丁字母表再次表示两次。还有其他类似的例子,尤其是在第一平面的数学字母表部分,那里还有三到四个以上的拉丁字母表。

还有其他的字符实际上是相同的,但在不同的代码点上。例如,有 µ (U+00B5 MICRO SIGN) 和 μ (U+03BC GREEK SMALL LETTER MU)。这些通常通过 分解 进行链接。

Unicode 处理一个抽象概念,称为 代码点。代码点明确定义了一个字符及其脚本或组。它对于字体中相应的 字形 如何呈现(对于拉丁文来说可能会有很大差异)并没有说明。它也没有定义如何在文件或内存中表示此代码点(即作为字节序列)。这是 Unicode 转换格式 的工作。

在两种具有不同码点的语言中拥有外观相似的字符的原因是什么?
Unicode 的主要要点如下:
- 兼容每个以前存在的字符编码。这必须确保对于在编码中使用过的每个字符,都存在一个一对一映射到 Unicode 码点的直接等价物。 - 忠实和准确地表示现在使用的每种文字,并扩展到以前使用过并需要存储在计算机系统中的其他文字。
因此,有一个非常强烈的动力来将脚本分开并试图根据它们的外观进行映射。外观可能会很棘手。例如,西里尔字母“т”在这里看起来像一个较小的大写拉丁字母“T”。然而,在斜体时通常呈现的方式:'т' 看起来像一个小写的拉丁字母“m”。你真的不想按照外观来映射这样的字符。

你提到的Unicode字符重复的第一个原因我不是很清楚,请您能否详细解释一下? - user12208242

9
如果您查看U+0400至U+04FF代码图表,您会发现U+0421是一个西里尔大写字母“es”。它可能看起来像拉丁字母C,但它是一个不同的逻辑字符。

两种不同的编码语言中,为什么会有外观相似的字符?(我想了解这个问题,因为我需要开发一个转换工具,用于不同编码之间的转换,其中一个编码是我们公司自己的专有编码格式。) - Sirish
@Sirish: 它们来自不同的文化,可能遵循不同的规则。例如,西里尔字母“EN”的大写形式看起来像拉丁字母“H”,但小写形式则不是。它们应该被区别对待 -用于显示它们的字形实际上是次要的。 - Jon Skeet
1
@Sirish:它们是两种不同“字母表”中外观相似的字符,这就是Unicode所处理的。它不涉及语言,只涉及字母表。实际上,西里尔字母ES的C形外观可以追溯到拜占庭时期希腊大写sigma的特定形式。与拉丁字母C的相似之处仅是偶然的。 - Arthur Reutenauer

8

这两个字母看起来相同,但实际上非常不同。U+0043是拉丁字母C,而U+0421是西里尔字母С(对应于拉丁字母表中的S)。

由于它们没有关联的含义,需要使用不同的编码点来防止大小写和排序算法变得极其上下文敏感 - 你会突然不知道处理哪种语言。


7
出于同样的原因,0 和 O 看起来相同(在大多数等宽字体中),但编码不同 - 它们表示不同的含义。

1
我曾经有一台没有“1”和“0”的打字机 :) - Kornel
关于零的历史注释(或者在计算机世界之外也许并不是那么历史悠久),请参见*斜杠零*。 - Peter Mortensen

2

U+0043是拉丁字母中的C,而U+0421是西里尔字母中的,这意味着它们实际上不是相同的字母,尽管它们看起来相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接