UTF-8:只有0-127如何存储到单个字节中?

ima*_*hat 5 unicode encoding utf-8

我需要帮助理解“从 0-127 的每个代码点如何存储在单个字节中”,如下所述。

这是上下文:

UTF-8 的绝妙概念就这样被发明了。UTF-8 是另一个使用 8 位字节在内存中存储 Unicode 代码点字符串(那些神奇的 U+ 数字)的系统。在 UTF-8 中,从 0 到 127 的每个代码点都存储在单个字节中。只有代码点 128 及以上才使用 2、3 个字节(实际上最多 6 个字节)来存储。

来源: http: //www.joelonsoftware.com/articles/Unicode.html

我知道数字 0-127 是用来表示 ASCII 字符的。Unicode 字符由 U+HexHex 表示,也称为代码点。0-127 如何转换为代码点?如果每个十六进制数可以代表 16 个选项,那么 1 个 8 位字节可以容纳 2 个十六进制数(2^8=16*16=256)。

问:那么可以表示的字符有 256 个,为什么停在 127 个呢?我明白为什么 256 个代码点以上的字符需要 2 个字节,但是为什么代码点 128-256 需要 2 个字节呢?

Rol*_*lig 6

打个比方,假设您要将长文本写到多个页面上,并且您需要确切地知道文本何时结束。那么你可能会保留右下角的一小部分作为注释,上面写着\xe2\x80\x9c文本在下一页继续\xe2\x80\x9d或\xe2\x80\x9c文本在这里结束\xe2\ x80\x9d。例子:

\n\n
page 1: This is a very [the text continues on the next page]\npage 2: long text that [the text continues on the next page]\npage 3: does not fit   [the text continues on the next page]\npage 4: on one page.   [the text ends here]\n
Run Code Online (Sandbox Code Playgroud)\n\n

很明显,页面的右下角不能用于普通文本,因为它已被连续标记使用。

\n\n

UTF-8 在将字节序列转换为代码点序列时使用了非常相似的技术。规则是:

\n\n
    \n
  • 如果序列的第一个字节在 0 到 127 之间,则其值为代码点。
  • \n
  • 如果序列的第一个字节在 128 和 191 之间,则为错误。
  • \n
  • 如果序列的第一个字节在192和255之间,则它属于几个字节的序列,并且这些字节的某些位用于计算码点。接下来的字节必须在 128 到 191 之间。
  • \n
\n\n

这意味着每个字节的最高位用作标记,表示 \xe2\x80\x9c 该字节是多字节代码点序列 \xe2\x80\x9d 的一部分。因为该位只有这个含义,不能有任何其他含义,所以只能用一个字节来表示从 0 到 127 的代码点。所有其他代码点都需要多个字节。

\n\n
\n\n

UTF-8 并不是以字节序列存储 Unicode 代码点的唯一可能性。您还可以使用以下规则定义编码:

\n\n
    \n
  • 如果第一个字节在 0 到 253 之间,则表示其代码点。
  • \n
  • 如果第一个字节是 254,则后面的两个字节用于 254 到 65535 范围内的代码点。
  • \n
  • 如果第一个字节是 255,则后面的三个字节用于 U+010000 到 U+10FFFF 范围内的代码点。
  • \n
\n\n

现在,从 0 到 253 的代码点只需要一个字节,但所有其他代码点至少需要三个字节,这对于希腊语、西里尔语、东亚和许多其他语言来说是浪费。

\n\n

UTF-8经过精心设计,确实很棒。尝试找到一些有关它的背景信息,以了解它的所有美丽。

\n