【发布时间】:2011-11-08 14:57:26
【问题描述】:
由于某种原因,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 可以无缝运行。
【问题讨论】:
-
它无法对其进行编码,因为 U+FEFF 是无效的非字符。这是因为 UTF-8 文件不应该包含 BOM!它们既不是必需的,也不是推荐的。字节顺序对 8 位代码单元没有意义。他们也把事情搞砸了,因为如果这些文件中有无关的(阅读:any)BOM,你不能再只做
cat a b c > abc。 UTF-8 流不应包含 BOM。如果你需要指定文件的内容,你应该使用更高级别的prototocl。这只是一个 Windows 错误。 -
@tchrist - 你知道,这个解释结合 Josh Lee 的建议将成为一个完美的答案。
-
你的错误信息是否碰巧提到了文件名
cp437.py?
标签: python unicode utf-8 io character-encoding