为何chr(0x24)+chr(0x84)在Python2/3中结果不同?0xc2来源解析
为什么Python 3中
chr(0x24) + chr(0x84)输出会出现0xc2? 嘿,这个问题的核心在于Python 2和Python 3对字符串的底层处理逻辑完全不同,再加上UTF-8编码的规则,才导致了你看到的差异。我来一步步给你讲明白:
1. Python 2 和 Python 3 中chr()函数的本质差异
- 在Python 2里,
chr()函数返回的是字节字符串(当时的str类型本质上就是字节序列)。所以chr(0x24)直接生成字节0x24(也就是字符$),chr(0x84)直接生成字节0x84,两者拼接后就是原始的字节序列b'\x24\x84',终端输出时也会直接打印这两个原始字节。 - 在Python 3里,
chr()函数返回的是Unicode字符(str类型是Unicode编码的字符串)。chr(0x84)对应的是Unicode码点U+0084,这是一个控制字符。当你在终端输出这个字符串时,Python会自动把Unicode字符串编码成终端默认的字符编码(绝大多数现代终端用的是UTF-8)。
2. 0xc2的来源:UTF-8编码规则
UTF-8是一种变长编码,对于不同范围的Unicode码点,编码后的字节数不同:
- 码点在
U+0000到U+007F之间(对应ASCII字符):用1个字节表示,字节最高位为0。 - 码点在
U+0080到U+07FF之间:用2个字节表示,第一个字节的二进制以110开头(对应十六进制的0xc0到0xdf),第二个字节以10开头(对应十六进制的0x80到0xbf)。
而U+0084正好落在U+0080到U+07FF这个区间里,它的UTF-8编码就是0xc2 0x84——这就是你在Python 3终端输出里看到0xc2的原因!
验证一下
你可以在Python 3里直接编码验证:
# 生成Unicode字符串 unicode_str = chr(0x24) + chr(0x84) # 编码为UTF-8字节序列 utf8_bytes = unicode_str.encode('utf-8') print(utf8_bytes) # 输出: b'$\xc2\x84'
而在Python 2里,直接打印拼接后的字符串,得到的是原始字节:
python2_str = chr(0x24) + chr(0x84) print(repr(python2_str)) # 输出: '$' + '\x84'(或直接显示为 b'$\x84',取决于环境)
总结一下:Python 2直接操作字节,而Python 3操作Unicode字符,输出时会自动编码为UTF-8,U+0084的UTF-8编码需要两个字节,所以就多出来了0xc2。
内容的提问来源于stack exchange,提问作者Olivier Lasne
相关产品推荐
相关产品推荐

