Pandas导入latin-1数据后Hex转UTF-8遇续字节解码错误
问题分析与解决
你遇到的错误核心是:转换得到的字节序列并非合法的UTF-8编码,因此用utf-8解码必然失败。
看你给出的示例十六进制串e91df6e4f947252c,转成字节后是b'\xe9\x1d\xf6\xe4\xf9G%,':
- 首字节
0xe9的二进制为11101001,属于UTF-8中三字节字符的首字节,按照UTF-8规则,它后面必须跟两个以10开头的续字节,但第二个字节0x1d是00011101,不符合续字节格式,因此触发解码错误。
可能的解决方向
1. 用Latin-1直接解码(无报错)
如果这个十六进制串本来就是Latin-1(ISO-8859-1)编码的文本,直接用Latin-1解码即可——Latin-1能映射所有单字节值,不会报错:
def hex_to_string(hex_str): if not hex_str: # 处理空字符串,避免后续报错 return "" # 去除前缀 if hex_str[:3] == ':0x': hex_str = hex_str[3:].lower() elif hex_str[:2] == '0x': hex_str = hex_str[2:].lower() # 转字节后用Latin-1解码 try: byte_data = binascii.unhexlify(hex_str) result = byte_data.decode('latin-1') print(result) return result except binascii.Error as e: print(f"无效十六进制串: {hex_str}, 错误: {e}") return ""
示例输出为:éöäùG%,(其中0x1d是ASCII控制字符,显示为)
2. 尝试其他编码格式
如果Latin-1的结果不符合预期,可以尝试GBK、CP1252等常见编码,同时用errors='replace'替换无法解码的字符,避免中断程序:
def hex_to_string(hex_str): if not hex_str: return "" if hex_str[:3] == ':0x': hex_str = hex_str[3:].lower() elif hex_str[:2] == '0x': hex_str = hex_str[2:].lower() try: byte_data = binascii.unhexlify(hex_str) # 优先尝试GBK,失败则用替换模式 try: result = byte_data.decode('gbk') except UnicodeDecodeError: result = byte_data.decode('gbk', errors='replace') print(result) return result except binascii.Error as e: print(f"无效十六进制串: {hex_str}, 错误: {e}") return ""
3. 确认数据是否为文本
如果这个十六进制串是Google Maps的二进制标识符(而非文本编码),不需要解码为字符串,直接保留十六进制格式即可:
def get_clean_hex(hex_str): if not hex_str: return "" if hex_str[:3] == ':0x': return hex_str[3:].lower() elif hex_str[:2] == '0x': return hex_str[2:].lower() return hex_str.lower()
代码优化提示
- 不要用
hex作为变量名(它是Python内置函数) - 增加异常处理,避免空串或无效十六进制导致程序崩溃
内容的提问来源于stack exchange,提问作者Dominic Jay
相关产品推荐
相关产品推荐

