Python读取未知编码文本文件如何转UTF-8解决字符串匹配失败问题
问题根因
你读取到的字符串每个可打印字符前都带\x00空字节,是典型的UTF-16LE编码文件被系统默认编码(通常为UTF-8或GBK)错误读取导致的,所以直接和普通字符串匹配必然失败。
解决方案
方案1:打开文件时直接指定编码(推荐)
修改open函数的参数,直接指定文件编码为utf-16-le,读取到的内容直接就是正常字符串:
# 将main函数里的open行替换为如下代码 logfile = open(argv[0], mode="r", encoding="utf-16-le")
修改后无需额外处理line变量,直接匹配即可。如果解码报错,可以将utf-16-le替换为utf-16,程序会自动识别字节序适配带BOM的UTF-16文件。
方案2:运行时对已读取的字符串转码
如果无法确定文件编码,或者不想修改文件打开逻辑,可以对读取到的line做二次转码:
def detectLicenseStopping(line): stopStr = "Stopping license" # 转码逻辑:先转回原始字节流,再用utf-16-le解码为正常字符串 clean_line = line.encode('latin1').decode('utf-16-le') if stopStr in clean_line: logger.info("Detected: " + str(clean_line) + " " + str(type(clean_line)))
补充说明
直接调用str()转换无效的原因是:你读取到的line本身已经是str类型,只是内容中夹杂了大量空字节,str()转换不会修改字符串本身的内容,因此无法解决问题。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

