UTF-8解码如何识别字节边界?

8 投票
1 回答
1313 浏览
提问于 2025-04-18 09:05

我最近在研究unicode编码,特别是跟Python有关的内容。我觉得我对这个话题有了比较清晰的理解,但还有一个小细节让我有点困惑。

解码是怎么知道字节的边界的呢?比如说,我有一个unicode字符串,其中有两个unicode字符,它们的字节表示分别是\xc6\xb4\xe2\x98\x82。我把这个unicode字符串写入一个文件,所以这个文件现在包含的字节是\xc6\xb4\xe2\x98\x82。然后我决定打开并读取这个文件(Python默认会把文件解码为utf-8),这就引出了我的主要问题。

解码是怎么知道要把字节\xc6\xb4解读为一个字符,而不是把\xc6\xb4\xe2当作一个字符呢?

1 个回答

11

字节的边界可以通过比特模式很容易地确定。在你的例子中,\xc6的开头是比特1100,而\xe2的开头是1110。在UTF-8编码中(我敢肯定这不是巧合),你只需要看第一个字节,就能通过数一数开头有多少个1位,直到遇到第一个0,就能知道整个字符有多少个字节。所以你的第一个字符有2个字节,第二个字符有3个字节。

如果一个字节以0开头,那就是一个普通的ASCII字符。

如果一个字节以10开头,那它是UTF-8序列的一部分(不是第一个字符)。

撰写回答