You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:47:43