我真的很困惑。当我这样做时:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
它给了我错误
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)
如果我这样做了:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
它工作得很好。
问题是第一种方法为什么会失败?如何插入bom?
如果第二种方法是正确的,那么使用codecs.open(filename, "w", "utf-8")
有什么意义?
我认为问题在于^{} 是字节字符串,而不是Unicode字符串。我怀疑文件处理程序试图根据“我本来打算将Unicode编写为UTF-8编码文本,但您给了我一个字节字符串”来猜测您的真正意思
尝试直接为字节顺序标记(即Unicode U+FEFF)编写Unicode字符串,以便文件将其编码为UTF-8:
(这似乎给出了正确的答案-一个字节为EF BB BF的文件。)
编辑:S.Lott的suggestion使用“utf-8-sig”作为编码比自己显式地编写BOM要好,但是我将在这里留下这个答案,因为它解释了以前发生的错误。
请阅读以下内容:http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig
做这个
生成的文件是带有预期BOM的UTF-8。
@S-Lott给出了正确的过程,但是在扩展Unicode问题时,Python解释器可以提供更多的见解。
Jon Skeet关于^{} 模块是正确的(不寻常的)-它包含字节字符串:
选择另一个nit,
BOM
有一个标准的Unicode名称,它可以输入为:也可以通过^{} 访问:
相关问题 更多 >
编程相关推荐