我真的很困惑 codecs.open function
。当我做:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
它给了我错误
UnicodeDecodeError:“ascii”编解码器无法解码位置 0 中的字节 0xef:序号不在范围内 (128)
如果我做:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
它工作正常。
问题 是为什么第一种方法失败了?以及如何插入 bom?
如果第二种方法是正确的方法,那么使用 codecs.open(filename, "w", "utf-8")
有什么意义?
原文由 John Jiang 发布,翻译遵循 CC BY-SA 4.0 许可协议
我认为问题在于
codecs.BOM_UTF8
是字节字符串,而不是 Unicode 字符串。我怀疑文件处理程序试图根据“我打算将 Unicode 编写为 UTF-8 编码的文本,但你给了我一个字节字符串!”来猜测你的真正意思。尝试直接为字节顺序标记(即 Unicode U+FEFF)编写 Unicode 字符串,以便文件仅将其编码为 UTF-8:
(这似乎给出了正确的答案——一个字节为 EF BB BF 的文件。)
编辑:S. Lott 关于 使用“utf-8-sig”作为编码的建议比自己明确编写 BOM 更好,但我将把这个答案留在这里,因为它解释了之前出了什么问题。