如果我将字符é
写入文件并使用十六进制编辑器打开它,我可以看到字节0xC3,0xA9。
来自维基百科,第一个字节称为前导字节,第二个字节称为尾随字节。 0xC3它是一个元数据字节,表示它用1字节0xA9编码的字符,但é
的unicode值是0xE9。
我基本上想知道为什么é
用0xA9而不是0xE9编码。文本编辑器如何从0xC3A9转换为0xE9?任何轮班操作?
答案 0 :(得分:12)
是什么让你认为0xC3是“元数据字节”?
UTF-8中的每个字节都包含有关编码的代码点的相关信息。
UTF-8编码的代码点的第一个字节包含一个标记(前导1的数量),表示用于编码代码点的总字节数(*) 和实际代码点的前几位。然后,所有尾随字节都包含一个“连续标记”(位10
)和另外6位编码的代码点。
关于UTF-8的维基百科文章有a pretty good description of the process。
有一个直接使用代码点值的编码:UTF-32(a.k.a UCS-4)基本上“将代码点值用作32位值”
(*)标记实际上非常简单:如果字节以(即最高位为)0
开头,则它是单字节编码(即代码点)在0到127之间)。如果它以10
开头,则它是一个连续字节。如果它是110
,1110
或11110
,那么它分别是2字节,3字节或4字节序列的开头。 111110
和1111110
也曾被定义,但在现代UTF-8中不再有效(因为只需要对那些保证永远不会在Unicode标准中使用的值进行编码)。