【问题标题】:Why are there duplicate characters in Unicode?为什么 Unicode 中有重复的字符?
【发布时间】:2009-11-16 10:11:45
【问题描述】:

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

【问题讨论】:

    标签: unicode codepoint


    【解决方案1】:

    正如其他人所指出的,您在这里的主要谬误是混淆了拉丁文和西里尔字母以及其中的一些字形(即 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要点是:

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

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

    【讨论】:

    • 不清楚您给出的 Unicode 字符重复的第一个原因。你能详细解释一下吗?
    【解决方案2】:

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

    【讨论】:

    • 什么是在两种具有不同代码点的语言中具有相似外观的字符的原因(我想知道这一点,因为我必须开发一种不同编码之间的转换实用程序,其中一种是自己公司拥有的专有编码格式)
    • @Sirish:他们是来自不同文化的不同角色,他们可能遵循不同的规则。例如,西里尔字母“EN”看起来像大写形式的拉丁文“H”——但不是小写形式。应该区别对待它们 - 用于显示它们的字形实际上是偶然的。
    • @Sirish:它们在两个不同的脚本中看起来很相似,这就是 Unicode 所处理的。不是语言,脚本。事实上,西里尔字母 ES 的 C 形外观要追溯到拜占庭时代大写希腊字母 sigma 的特定形式。与拉丁 C 的相似之处只是偶然的。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我的打字机没有10 :)
      • 有关零出现的历史记录(或者在计算机世界之外可能不那么具有历史意义),请参阅 slashed zero
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2021-04-10
        • 2016-04-13
        • 1970-01-01
        • 2021-06-25
        • 2015-03-25
        • 2016-07-23
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        相关资源
        最近更新 更多