【问题标题】:what is meant by the notation "U+" when discussing Unicode encoding?在讨论 Unicode 编码时,符号“U+”是什么意思?
【发布时间】:2018-05-23 19:48:11
【问题描述】:

我意识到这是非常基本的,因为我正在阅读维基百科中的 Unicode 以及它指向的任何地方。但是这个“U+0000”语义没有完全解释。在我看来,“U”总是等于 0。

为什么“U+”是符号的一部分?这到底是什么意思? (它似乎是一些基本值,但我无法理解它何时或为什么非零。)

另外,如果我从其他来源收到一串文本,我如何知道该字符串是 UTF-8、UTF-16 还是 UTF-32 编码的?有什么方法可以根据上下文自动确定吗?

【问题讨论】:

    标签: unicode unicode-string


    【解决方案1】:
    1. 来自维基百科,文章Unicode,部分Architecture and Terminology

      Unicode 定义了 0 到 10FFFF(十六进制)范围内的 1,114,112 个代码点的代码空间。通常通过写“U+”后跟其十六进制数字来引用 Unicode 代码点。对于基本多语言平面 (BMP) 中的代码点,使用四位数字(例如,字符 LATIN CAPITAL LETTER X 的 U+0058);对于 BMP 之外的代码点,使用五位或六位数字。

      引入此约定是为了让读者了解代码点具体是一个 Unicode 代码点。例如,字母ă(拉丁文小写字母A WITH BREVE)为U+0103;在代码页 852 中它的代码是 0xC7,在代码页 1250 中它的代码是 0xE3,但是当我写 U+0103 时,每个人都明白我的意思是 Unicode 代码点,他们可以查找它。

    2. 对于用拉丁字母书写的语言,UTF-16 和 UTF-32 字符串很可能包含大量值为 0 的字节,这些字节不应出现在 UTF-8 编码字符串中。通过查看 哪些 个字节为零,您还可以推断 UTF-16 和 UTF-32 字符串的字节顺序,即使在没有 Byte Order Mark 的情况下也是如此。

      例如,如果你得到字节

       0xC3 0x89 0x70 0xC3 0xA9 0x65
      

      这很可能是 UTF-8 编码的Épée。在 little-endian UTF-16 中,这将是

       0x00 0xC9 0x00 0x70 0x00 0xE9 0x00 0x65
      

      (注意每个偶数字节如何为零。)

    【讨论】:

    • 谢谢,我自己开始发现其中一些,但这个答案非常有帮助。
    • 所以我了解到“U”没有添加到任何东西,它只是一个类似于“0x”前面十六进制或“H”后面的符号(这似乎已被弃用,谢天谢地)。而且看起来我所看到的一切,就输入的文本字符串而言是 UTF-8。因此 ASCII 7 位范围之外的 no 字符被编码为单个字节。例如在 UTF-8 中,¢ 字符绝不是 0xA2 的单个字节。如果你想要 UTF-8 中的 ¢,它必须被编码为两个字节 0xC2A2。所以对于 UTF-8,没有 "extended ASCII"。并且这些字符必须是两个或更多字节。
    • @robertbristow-johnson:是的,有些语言使用转义符号 \u1234(可能还有 \U103456)。注意:U+XXXX(和 \u)被解码,因为它是字符的逻辑(和抽象)表示:它表示 unicode 表中的一个字符,而没有告诉我们如何将它作为字节放置。相反,0xAA 被编码,因此是字节的物理表示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2011-04-07
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多