在Python中写入UTF-8文件

2024-04-20 09:36:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我真的很困惑。当我这样做时:

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")有什么意义?


Tags: 方法inclose错误asciiopenutf8bom
3条回答

我认为问题在于^{}是字节字符串,而不是Unicode字符串。我怀疑文件处理程序试图根据“我本来打算将Unicode编写为UTF-8编码文本,但您给了我一个字节字符串”来猜测您的真正意思

尝试直接为字节顺序标记(即Unicode U+FEFF)编写Unicode字符串,以便文件将其编码为UTF-8:

import codecs

file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()

(这似乎给出了正确的答案-一个字节为EF BB BF的文件。)

编辑:S.Lott的suggestion使用“utf-8-sig”作为编码比自己显式地编写BOM要好,但是我将在这里留下这个答案,因为它解释了以前发生的错误。

请阅读以下内容:http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig

做这个

with codecs.open("test_output", "w", "utf-8-sig") as temp:
    temp.write("hi mom\n")
    temp.write(u"This has ♭")

生成的文件是带有预期BOM的UTF-8。

@S-Lott给出了正确的过程,但是在扩展Unicode问题时,Python解释器可以提供更多的见解。

Jon Skeet关于^{}模块是正确的(不寻常的)-它包含字节字符串:

>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>> 

选择另一个nit,BOM有一个标准的Unicode名称,它可以输入为:

>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'

也可以通过^{}访问:

>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>> 

相关问题 更多 >