如果我将字符写入é
文件并使用十六进制编辑器打开它,我可以看到字节 0xC3、0xA9。
在维基百科中,第一个字节称为前导字节,第二个字节称为尾随字节。0xC3 它是一个元数据字节,这意味着它用 1 个字节 0xA9 编码的字符,但它的 unicode 值é
是0xE9。
我基本上想知道为什么é
它用 0xA9 而不是 0xE9 编码。文本编辑器如何从 0xC3A9 转换为 0xE9?有什么移位操作吗?
是什么让您认为 0xC3 是“元数据字节”?
UTF-8 中的每个字节都包含有关已编码代码点的相关信息。
UTF-8 编码代码点的第一个字节包含一个标记(前导 1 的数量),它指示用于编码代码点(*)的字节总数 和实际代码点的前几位。然后所有尾随字节包含一个“继续标记”(位10
)和编码代码点的另外 6 个位。
关于 UTF-8 的 Wikipedia 文章对这个过程有很好的描述。
有一种直接使用代码点值的编码:UTF-32(又名 UCS-4),基本上是“将代码点值用作 32 位值”
(*)标记实际上非常简单:如果字节以 (即,它的最高有效位是) 开头0
,那么它是单字节编码(即,0 到 127 之间的代码点)。如果它以 开头10
,那么它是一个连续字节。如果是110
,则分别是 2、3 或 4 字节序列的开始1110
。并且曾经也被定义过,但在现代 UTF-8 中不再有效(因为只需要对保证永远不会在 Unicode 标准中使用的值进行编码)。11110
111110
1111110