我在Unicode中看到一些重复的字符。例如,字符'C'可以用代码点U+0043和U+0421表示。为什么会这样呢?
正如其他人所指出的,你在这里的主要谬误是混淆了拉丁和西里尔文字母以及其中一些字形(即 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 转换格式 的工作。
在两种具有不同码点的语言中拥有外观相似的字符的原因是什么?这两个字母看起来相同,但实际上非常不同。U+0043是拉丁字母C,而U+0421是西里尔字母С(对应于拉丁字母表中的S)。
由于它们没有关联的含义,需要使用不同的编码点来防止大小写和排序算法变得极其上下文敏感 - 你会突然不知道处理哪种语言。
U+0043
是拉丁字母中的C
,而U+0421
是西里尔字母中的,这意味着它们实际上不是相同的字母,尽管它们看起来相同。