【发布时间】:2009-11-16 10:11:45
【问题描述】:
我可以在Unicode 中看到一些重复的字符。例如,字符“C”可以由代码点 U+0043 和 U+0421 表示。为什么会这样?
【问题讨论】:
我可以在Unicode 中看到一些重复的字符。例如,字符“C”可以由代码点 U+0043 和 U+0421 表示。为什么会这样?
【问题讨论】:
正如其他人所指出的,您在这里的主要谬误是混淆了拉丁文和西里尔字母以及其中的一些字形(即 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)。这些通常由decomposition 链接。
Unicode 处理一个名为code point 的抽象概念。代码点明确定义了一个字符及其脚本或组。它没有说明字体中对应的字形将如何呈现(对于拉丁语来说,这可能已经大不相同了)。它也没有定义这个代码点如何在文件或内存中表示(即作为字节序列)。这是Unicode Transformation Formats 之一的工作。
在两种不同代码点的语言中具有相似外观的字符的原因是什么?
这里的Unicode要点是:
所以有一个非常强烈的动机来保持脚本分开并且不尝试根据字符的外观来映射字符。无论如何,外观可能很棘手。以西里尔字母 'т' 为例,它在这里看起来像一个较小的大写拉丁文 'T'。但是,斜体时的通常呈现方式:'т' 看起来像一个小写的拉丁语“m”。您真的不想通过外观来映射此类字符。
【讨论】:
如果您查看U+0400 to U+04FF code chart,您会发现 U+0421 是一个西里尔大写字母“es”。它可能看起来像拉丁文 C,但它是一个不同的逻辑字符。
【讨论】:
字母看起来相同,但非常不同。 U+0043 是拉丁字母 C,但 U+0421 是西里尔字母 С(对应拉丁字母中的 S)。
由于它们不相关的含义,需要单独的代码点来防止大小写和排序算法对上下文非常敏感 - 你会突然不得不猜测你在处理什么语言。
【讨论】:
出于同样的原因,0 和 O 看起来相同(在大多数等宽字体中),但编码不同 - 它们意味着不同的东西。
【讨论】:
1 和0 :)
U+0043 是C 的拉丁文表示,而U+0421 是西里尔文,这意味着它们实际上不是同一个字母,尽管看起来可能相同。
【讨论】: