我正在使用Python读取一系列源代码文件,并遇到unicode BOM错误。这是我的代码:
bytes = min(32, os.path.getsize(filename))
raw = open(filename, 'rb').read(bytes)
result = chardet.detect(raw)
encoding = result['encoding']
infile = open(filename, mode, encoding=encoding)
data = infile.read()
infile.close()
print(data)
如您所见,我正在使用chardet
检测编码,然后在内存中读取文件并尝试打印它。print语句在包含BOM的Unicode文件上失败,错误为:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2:
character maps to <undefined>
我猜它试图使用默认字符集解码BOM,但失败了。如何从字符串中删除BOM以防止出现这种情况?
除非显式使用
utf-8-sig
编码,否则在对UTF-16(而不是UTF-8)进行解码时,应该自动剥离BOM字符。你可以试试这样的:我根据丘伊的答案设计了一个漂亮的基于BOM的探测器。在通常的用例中,数据可以是已知的本地编码,也可以是带有BOM的Unicode(这是文本编辑器通常生成的)。更重要的是,与
chardet
不同,它不做任何随机猜测,因此它提供可预测的结果:没有理由检查BOM是否存在,
utf-8-sig
为您管理它,如果BOM不存在,则其行为与utf-8
完全相同:在上面的例子中,您可以看到
utf-8-sig
正确地解码给定的字符串,而不考虑BOM的存在。如果您认为您正在读取的文件中存在BOM字符的可能性很小,那么只需使用utf-8-sig
,而不用担心相关问题 更多 >
编程相关推荐