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

为什么Unicode中存在重复字符?,unicode,codepoint,Unicode,Codepoint,我可以在中看到一些重复的字符。例如,字符“C”可以由代码点U+0043和U+0421表示。为什么会这样?如果你看一下,你会发现U+0421是西里尔语大写字母“es”。它可能看起来像拉丁语C,但它是一个不同的逻辑字符。字母看起来相同,但非常不同。U+0043是拉丁字母C,但U+0421是西里尔字母С(对应于拉丁字母表中的S) 因为它们的含义不相关,所以需要单独的代码点来防止大小写和排序算法对上下文非常敏感-你可能会突然猜到你正在使用的语言。U+0043是C的拉丁表示,而U+0421是西里尔语,这意

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

如果你看一下,你会发现U+0421是西里尔语大写字母“es”。它可能看起来像拉丁语C,但它是一个不同的逻辑字符。

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


因为它们的含义不相关,所以需要单独的代码点来防止大小写和排序算法对上下文非常敏感-你可能会突然猜到你正在使用的语言。

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

正如其他人所指出的,你的主要谬误是混淆了拉丁语和西里尔语以及其中的一些字形(即C()和С())。有许多这样的字符对看起来很相似,但却是不同的字符。例如,你会在拉丁语、希腊语和西里尔语中找到很多。不过,大多数情况下,它们只能使用大写或小写字母

然而,事实上也有重复,有时是故意重复。例如,整个(ASCII)拉丁字母在U+FF00和U+FFEF之间的“半宽和全宽格式”Unicode块中再次表示两次。不过,还有其他类似的例子,最显著的例子是平面1上的数学字母部分,其中还有三个或四个以上的拉丁字母

还有一些东西实际上是相同的字符,但在不同的代码点。例如,有µ()和μ()。这些通常是通过链接的

Unicode处理一个抽象概念,称为。代码点明确定义了字符及其脚本或组。它没有说明字体中对应的字形将如何呈现(拉丁语可能已经有很大的不同)。它也没有定义此代码点在文件或内存中的表示方式(即字节序列)。这是一份适合一个年轻人的工作


在两种语言中使用具有不同代码点的相似字符的原因是什么

Unicode的要点如下:

  • 与以前存在的所有字符编码兼容。这必须确保编码中使用的每个字符都有一对一的映射,映射到直接等效的Unicode代码点
  • 忠实准确地表示当前使用的每个脚本,后来扩展到其他正在使用并需要存储在计算机系统中的脚本

因此,有一个非常强烈的动机是保持脚本分开,而不是试图根据其外观映射字符。不管怎么说,外表可能很棘手。以西里尔字母“τ”为例,它在这里看起来像一个较小的大写拉丁字母“T”。然而,斜体显示时的通常方式是:“τ”看起来像小写拉丁字母“m”。你真的不想通过外观来映射这些字符。

同样的原因是
0
O
看起来一样(在大多数单间距字体中),但编码不同-它们意味着不同的东西。

在两种语言中使用具有不同代码点的相似字符的原因是什么(我想知道这一点,因为我必须开发一个不同编码之间的转换实用程序,其中一个是公司自己的专有编码格式)@Sirish:它们是来自不同文化的不同字符,可能遵循不同的规则。例如,西里尔文的“EN”看起来像拉丁语的“H”大写形式-但不是小写形式。它们应该被区别对待-用于显示它们的字形是偶然的,真的。@Sirish:它们是两个不同脚本中外观相似的字符,这是Unicode处理的。不是语言,而是脚本。事实上,西里尔字母E的C形外观可以追溯到一个特定的f拜占庭时期希腊西格玛的大写形式。与拉丁语C的相似性只是偶然的。我有一台没有
1
0
:)的打字机,作为关于零的出现的历史注释(或者在计算机世界之外可能没有那么历史性),请参阅。不清楚您给出的Unicode字符重复的第一个原因。你能详细解释一下吗?