加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

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

发布时间:2021-11-07 14:28:45 所属栏目:语言 来源:互联网
导读:大家在 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'xe9x9dx92'  
>>> b = '青南'  
>>> b.encode()  
b'xe9x9dx92xe5x8dx97'  
注意这里的xe9需要作为整体来看待,表示一个16进制数。
 
所以,当我要把 Bytes 型数据xe9x9dx92xe5x8dx97 转为字符串时,Python 会把xe9x9dx92转成青字,把xe5x8dx97转成南字,看起来,似乎是 Python 知道应该把每3个 Bytes 符号一组来进行处理。
 
然而,Unicode 中,emoji 表情是4个字节,例如表情符号:
 
??,它对应的 Bytes 型数据为:
 
xf0x9fxa4x94,如下图所示:
 
 
 
如果我把青??南转换为 Bytes 型数据,值为:
 
xe9x9dx92xf0x9fxa4x94xe5x8dx97,如下图所示,一共10个 Bytes 字符:
 
 
 
那么问题来了,当我对这个 Bytes 型数据进行 decode 会怎么样呢?如下图所示:
 
 
 
Python 可以正确地把 Bytes 数据划分为:
 
xe9x9dx92 对应“青”  
xf0x9fxa4x94 对应“���”  
xe5x8dx97 对应“南”  
为什么 Python 知道要把xf0x9fxa4x94这4个符号分到一组?为什么不会像下面这样分组?
 
xe9x9dx92  
xf0x9fxa4  
x94xe5x8dx97  
实际上,这个问题的原因,只有当我们用二进制来看的时候,才能发现端倪。 青对应的第一个 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 是这样判断应该有几个字符一组的。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读