Python 3.9中扩展ASCII十六进制字符串解码错误求助
解决Python中扩展ASCII十六进制字符串转字符的问题
你的问题出在默认用utf-8解码字节,但utf-8不支持0x80-0xFF范围的单字节扩展ASCII字符——这些字节不是合法的utf-8编码单元,所以会抛出解码异常。要处理全范围0x00-0xFF的十六进制字符串转对应字符,有两种直接的解决方案:
方案1:使用latin-1编码解码
latin-1(也叫ISO-8859-1)编码对每个0x00到0xFF的字节,都直接映射到Unicode中对应的码点,完美匹配扩展ASCII的需求:
# 处理0-127范围的字符 d1 = "5E" # ^ bytes_array = bytes.fromhex(d1) value = bytes_array.decode('latin-1') print(value) # 输出^ # 处理0xA6这类扩展ASCII字符 d2 = "A6" # ¦ bytes_array = bytes.fromhex(d2) value = bytes_array.decode('latin-1') print(value) # 输出¦
方案2:使用cp1252编码解码
如果你的字符是Windows环境下的扩展ASCII,cp1252(Windows-1252)是更贴合的选择,它在latin-1基础上补充了一些特殊字符,对于0xA6这类字符,结果和latin-1一致:
d2 = "A6" bytes_array = bytes.fromhex(d2) value = bytes_array.decode('cp1252') print(value) # 输出¦
关键说明
utf-8是多字节编码,仅0x00-0x7F的单字节和ASCII兼容,0x80以上的字节需要和其他字节组合成合法的utf-8序列,单独解码会报错。latin-1和cp1252都是单字节编码,能直接将每个字节转换为对应字符,覆盖你需要的全范围十六进制值。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

