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 个字节呢?
打个比方,假设您要将长文本写到多个页面上,并且您需要确切地知道文本何时结束。那么你可能会保留右下角的一小部分作为注释,上面写着\xe2\x80\x9c文本在下一页继续\xe2\x80\x9d或\xe2\x80\x9c文本在这里结束\xe2\ x80\x9d。例子:
\n\npage 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]\nRun Code Online (Sandbox Code Playgroud)\n\n很明显,页面的右下角不能用于普通文本,因为它已被连续标记使用。
\n\nUTF-8 在将字节序列转换为代码点序列时使用了非常相似的技术。规则是:
\n\n这意味着每个字节的最高位用作标记,表示 \xe2\x80\x9c 该字节是多字节代码点序列 \xe2\x80\x9d 的一部分。因为该位只有这个含义,不能有任何其他含义,所以只能用一个字节来表示从 0 到 127 的代码点。所有其他代码点都需要多个字节。
\n\nUTF-8 并不是以字节序列存储 Unicode 代码点的唯一可能性。您还可以使用以下规则定义编码:
\n\n现在,从 0 到 253 的代码点只需要一个字节,但所有其他代码点至少需要三个字节,这对于希腊语、西里尔语、东亚和许多其他语言来说是浪费。
\n\nUTF-8经过精心设计,确实很棒。尝试找到一些有关它的背景信息,以了解它的所有美丽。
\n