运行脚本处理解压文件报UnicodeDecodeError编码错误问题咨询
编码报错问题解答
首先附上你提到的报错信息:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 5906: invalid continuation byte for unzipped file
问题1:是否存在会导致脚本识别异常的特殊字符?
这个报错本质不是「特殊字符」导致的,核心原因是文件实际存储编码和脚本指定的UTF-8解码规则不匹配:
- 字节
0xc9本身在GB2312/GBK、Latin-1等非UTF-8编码中是合法字符的组成部分,比如GBK编码中0xc9 0xcf对应汉字「上」 - UTF-8编码规则下,
0xc9属于双字节字符的首字节,后面必须跟随格式为0x80-0xBF的续字节,你当前文件中该位置的后续字节不符合要求,本质就是文件本身不是UTF-8编码格式。
问题2:position 5906的含义及查看方法
这个position是从文件开头起始计算的字节偏移量,既不是行号,也不是解码后的字符位置。
不同系统查看对应位置内容的方法如下:
- Linux/macOS系统:使用
xxd命令直接读取指定偏移量的字节,示例命令(替换为你自己的文件名,会展示偏移量后20个字节的上下文):xxd -s 5906 -l 20 目标文件名 - Windows系统:使用PowerShell命令读取对应位置字节:
Get-Content 目标文件名 -Encoding Byte -TotalCount 5926 | Select-Object -Skip 5906 | Format-Hex
通用解决方法
- 先检测文件实际编码:可以用Python的
chardet库识别,示例代码:import chardet with open("目标文件名", "rb") as f: raw_data = f.read() print(chardet.detect(raw_data)) - 读取文件时指定对应编码:比如检测到编码为GBK,就修改文件读取代码为:
with open("目标文件名", encoding="gbk") as f: content = f.read() - 如果不需要严格处理编码,也可以在读取时添加容错参数避免直接报错:
# 遇到无法解码的字节直接替换为�符号 with open("目标文件名", encoding="utf-8", errors="replace") as f: content = f.read()
内容的提问来源于stack exchange,提问作者Alexandra
相关产品推荐
相关产品推荐

