5

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

4

5 回答 5

20

正如其他人所指出的,您在这里的主要谬误是混淆了拉丁文和西里尔字母以及其中的一些字形(即 C(U+0043 LATIN CAPITAL LETTER C)和 С(U+0421 CYRILLIC CAPITAL LETTER ES))。有许多这样的字符对看起来很相似,但它们是不同的字符。例如,您会在拉丁语、希腊语和西里尔语中找到很多。不过,大多数时候它们只能以大写或小写形式工作。

然而,实际上重复,有时是故意的。例如,整个 (ASCII) 拉丁字母在 U+FF00 和 U+FFEF 之间的“半角和全角形式”Unicode 块中再次表示两次。不过,还有其他这样的例子,最值得注意的是在平面 1 的数学字母部分,其中存在三个或四个拉丁字母。

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

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

有什么理由在具有不同代码点的两种语言中具有相似的字符?

这里Unicode的要点是:

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

因此,有很强的动机将脚本分开,而不是尝试根据字符的外观来映射字符。无论如何,外观可能很棘手。以西里尔字母 'т' 为例,它在这里看起来像一个较小的大写拉丁文 'T'。但是,斜体时的通常呈现方式:“т”看起来像小写拉丁语“m”。你真的不想通过外观来映射这些字符。

于 2009-11-16T10:20:25.040 回答
9

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

于 2009-11-16T10:14:49.700 回答
8

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

由于它们不相关的含义,需要单独的代码点来防止大小写和排序算法对上下文非常敏感——你会突然不得不猜测你在处理什么语言。

于 2009-11-16T10:16:18.350 回答
7

出于同样的原因,0并且O看起来相同(在大多数等宽字体中),但编码不同 - 它们意味着不同的东西。

于 2009-11-16T10:42:00.337 回答
2

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

于 2009-11-16T10:17:25.340 回答