为什么Python的unicode字符串需要对UTF-8 BOM进行特殊处理?

14 投票
2 回答
8494 浏览
提问于 2025-04-17 01:08

不知道为什么,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 标记。

撰写回答