为什么Python的unicode字符串需要对UTF-8 BOM进行特殊处理?
不知道为什么,Python在从一个UTF-8文件读取unicode字符串时,似乎对BOM有些问题。来看下面这个例子:
with open('test.py') as f:
for line in f:
print unicode(line, 'utf-8')
看起来很简单,对吧?
我也是这么想的,直到我在命令行运行它,结果出现了:
UnicodeEncodeError: 'charmap' 编码无法编码字符 u'\ufeff' 在位置 0: 字符映射到
<undefined>
我简单查了一下Google,发现BOM需要手动清除:
import codecs
with open('test.py') as f:
for line in f:
print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')
这个代码运行得很好。不过我还是觉得这有点难以理解。
这种行为有什么原因吗? 相比之下,UTF-16就没有这个问题。
2 个回答
28
'utf-8-sig'
编码会自动处理文件开头的 BOM 标记。