首页 > 解决方案 > 在讨论 Unicode 编码时,符号“U+”是什么意思?

问题描述

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

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

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

标签: unicodeunicode-string

解决方案


  1. 来自维基百科,文章Unicode架构和术语部分:

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

    引入此约定是为了让读者了解代码点专门是Unicode代码点。例如,字母ă(LATIN SMALL LETTER 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
    

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

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

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


推荐阅读