我可以在Unicode中看到一些重复的字符。例如,字符“C”可以由代码点U + 0043和U + 0421表示。为什么会这样?
答案 0 :(得分:20)
正如其他人所指出的那样,你在这里的主要谬误是混淆了拉丁文和西里尔文字以及其中的一些字形(即C(U+0043 LATIN CAPITAL LETTER C)和С(U+0421 CYRILLIC CAPITAL LETTER ES))。有许多这样的角色对看起来很相似但是角色不同。例如,你会发现很多拉丁语,希腊语和西里尔语。但大多数情况下,它们只能以大写或小写形式工作。
然而, 实际上是重复的,有时是故意的。例如,整个(ASCII)拉丁字母表在U + FF00和U + FFEF之间的'Halfwidth and Fullwidth Forms'Unicode块中再次表示两次。还有其他这样的例子,最值得注意的是在平面1的数学字母表部分,其中有三到四个拉丁字母存在。
其他事情实际上是相同的角色,但在不同的代码点。例如,有μ(U+00B5 MICRO SIGN)和μ(U+03BC GREEK SMALL LETTER MU)。这些通常由decomposition链接。
Unicode处理名为code point的抽象概念。代码点明确定义了一个字符及其脚本或组。它说 nothing 关于如何呈现字体中相应的字形(对于拉丁语来说可能会有很大差异)。它也没有定义如何在文件或存储器中表示该代码点(即作为字节序列)。这是Unicode Transformation Formats之一的工作。
在具有不同代码点的两种语言中具有相似外观字符的原因是什么?
Unicode的要点是:
因此,非常强烈要求将脚本分开并且不尝试根据其外观映射字符。无论如何,外观可能很棘手。以西里尔字母'т'为例,在这里看起来像一个较小的大写拉丁语'T'。但是,斜体时呈现的通常方式是:'т'看起来像一个小写的拉丁语'm'。你真的不想通过外观来映射这些角色。
答案 1 :(得分:9)
如果你看U+0400 to U+04FF code chart,你会发现U + 0421是一个西里尔语的资本主义者“es”。它可能看起来像拉丁语C一样,但它是一个不同的逻辑角色。
答案 2 :(得分:8)
字母LOOK相同,但却非常不同。 U + 0043是拉丁字母C,但U + 0421是西里尔字母С(对应于拉丁字母中的S)。
由于它们的含义无关,因此需要单独的代码点来防止套管和排序算法对上下文非常敏感 - 你会突然猜到你正在处理的语言。
答案 3 :(得分:7)
出于同样的原因0
和O
看起来相同(在大多数单倍行距字体中),但编码方式不同 - 它们意味着不同的东西。
答案 4 :(得分:2)
U+0043
是C
的拉丁语表示,而U+0421
是西里尔语,意思是它们实际上不是同一个字母,即使它们看起来可能相同。