Python中int转chr操作在循环、脚本与REPL中表现不一致
问题原因
你遇到的REPL与脚本/for循环输出不一致、字符显示不全的问题,本质是不可见字符的不同展示规则导致的,转换逻辑本身没有丢失内容:
- 你数组中的
151(0x97)、131(0x83)、135(0x87)属于Unicode C1控制字符区间(0x80~0x9F),这类字符没有可打印的字形,终端渲染时会默认忽略。 - REPL环境下直接输出字符串时,默认调用的是对象的
__repr__方法,会将不可见字符转为\xXX格式的转义序列显示,所以你能看到完整的字符串结构。 print函数以及脚本直接输出时,调用的是对象的__str__方法,会将原始字符直接交给终端渲染,因此控制字符不会被显示,你只能看到中间三个可打印字符h、Ø、<。
解决方法
场景1:需要将整数数组转为字节串(最常用场景)
直接使用Python内置的bytes()构造函数即可,不需要经过字符转换,能完整保留所有原始数值:
arr = [151, 131, 104, 216, 60, 135] byte_data = bytes(arr) # 得到结果:b'\x97\x83h\xd8<\x87'
如果需要把字节串转为可安全打印的十六进制字符串,调用hex()方法即可:
print(byte_data.hex()) # 输出:978368d83c87
场景2:确实需要转为字符串,且要完整显示所有内容
使用repr()函数获取字符串的可打印表示,即可得到和REPL输出一致的结果:
arr = [151, 131, 104, 216, 60, 135] str_data = ''.join(map(chr, arr)) print(repr(str_data)) # 输出:'\x97\x83hØ<\x87'
内容的提问来源于stack exchange,提问作者owais
相关产品推荐
相关产品推荐

