站长网 语言 三个一组还是四个一组?从Bytes到Unicode的字节划分技巧

三个一组还是四个一组?从Bytes到Unicode的字节划分技巧

大家在 Python 开发过程中,经常会进行字符串encode为 Bytes型数据,或者把 Bytes 型数据 decode为字符串的操作。例如:图片我们知道,在 Unicode 编码中,中文占3个字节,所以一个中文字符编码为 Bytes 型数据以后,会占用3个 Bytes 字符,例如: a = 青 a

大家在 Python 开发过程中,经常会进行字符串encode为 Bytes型数据,或者把 Bytes 型数据 decode为字符串的操作。例如:图片我们知道,在 Unicode 编码中,中文占3个字节,所以一个中文字符编码为 Bytes 型数据以后,会占用3个 Bytes 字符,例如:
 
 
 
>>> a = '青'  
>>> a.encode()  
b'\xe9\x9d\x92'  
>>> b = '青南'  
>>> b.encode()  
b'\xe9\x9d\x92\xe5\x8d\x97'  
注意这里的\xe9需要作为整体来看待,表示一个16进制数。
 
所以,当我要把 Bytes 型数据\xe9\x9d\x92\xe5\x8d\x97 转为字符串时,Python 会把\xe9\x9d\x92转成青字,把\xe5\x8d\x97转成南字,看起来,似乎是 Python 知道应该把每3个 Bytes 符号一组来进行处理。
 
然而,Unicode 中,emoji 表情是4个字节,例如表情符号:
 
??,它对应的 Bytes 型数据为:
 
\xf0\x9f\xa4\x94,如下图所示:
 
 
 
如果我把青??南转换为 Bytes 型数据,值为:
 
\xe9\x9d\x92\xf0\x9f\xa4\x94\xe5\x8d\x97,如下图所示,一共10个 Bytes 字符:
 
 
 
那么问题来了,当我对这个 Bytes 型数据进行 decode 会怎么样呢?如下图所示:
 
 
 
Python 可以正确地把 Bytes 数据划分为:
 
\xe9\x9d\x92 对应“青”  
\xf0\x9f\xa4\x94 对应“���”  
\xe5\x8d\x97 对应“南”  
为什么 Python 知道要把\xf0\x9f\xa4\x94这4个符号分到一组?为什么不会像下面这样分组?
 
\xe9\x9d\x92  
\xf0\x9f\xa4  
\x94\xe5\x8d\x97  
实际上,这个问题的原因,只有当我们用二进制来看的时候,才能发现端倪。 青对应的第一个 Bytes 字符\xe9,其中的e9是一个十六进制数字,把它转成十进制是233,转成二进制是11101001。 南对应的第一个 Bytes 字符\xe5,其中的e5是一个十六进制数字,把它转成十进制是229,转成二进制是11100101。 ??对应的第一个 Bytes 字符\xf0,其中的f0是一个十六进制数字,把它转成十进制是240,转成二进制是11110000。如果还看不出他们的差异,那我们把他们放在一起对比一下:
 
11101001  
11100101  
11110000  
看出差异了吗?中文汉字是三个字节,转换为 Bytes 型数据以后,第一个字符对应的二进制数是1110开头。emoji 是4个字节,转换为 Bytes 型数据以后,第一个字符对应的二进制数是1111开头。所以,当给定一个 Bytes 型数据需要给 Python 来转换为字符串的时候,Python 是这样判断应该有几个字符一组的。

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/biancheng/yuyan/2021/1105/20535.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部