UTF-8解码如何识别字节边界?
我最近在研究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序列的一部分(不是第一个字符)。