bytes对象传入str构造器长度异常:2字节为何变为11个字符
问题原因说明
你执行的代码如下:
a = bytes("Ä","utf8") x = str(a) print(len(x))
出现输出为11的核心原因是:直接调用str()转换bytes对象时如果不指定编码参数,不会执行字节解码操作,而是返回bytes对象的字面量表示字符串。
具体执行逻辑:
- 字符
Ä用UTF-8编码得到的字节对象为b'\xc3\x84',确实仅占2个字节 - 调用
str(a)时,Python不会把字节序列解码为对应文本,而是生成这个字节对象的可打印官方表示,也就是把b'\xc3\x84'这个字节字面量的全部可见字符直接转为普通字符串 - 我们逐个数这个字面量的字符,刚好是11个:
- 第1位:字节标识
b - 第2位:起始单引号
' - 第3位:转义符反斜杠
\ - 第4位:十六进制标识
x - 第5位:十六进制字符
c - 第6位:十六进制字符
3 - 第7位:转义符反斜杠
\ - 第8位:十六进制标识
x - 第9位:十六进制字符
8 - 第10位:十六进制字符
4 - 第11位:结束单引号
'
如果需要正常解码得到原始的Ä字符串,应该使用以下两种正确写法:
# 写法1:直接调用字节对象的decode方法指定编码 x = a.decode('utf-8') # 写法2:给str构造器传入encoding参数 x = str(a, encoding='utf-8')
两种写法得到的x都是长度为1的Ä字符串,符合预期。
内容的提问来源于stack exchange,提问作者chakmeshma
相关产品推荐
相关产品推荐

