I_Like_AI 发表于 2018-9-20 17:48:10

UnicodeDecodeError: 'ASCII' codec unable to decode byte 0xef of position 0: s...

当我运行下面代码时:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
它给了我错误
UnicodeDecodeError: 'ASCII' codec unable to decode byte 0xef of position 0: serial number out of range (128)
换个方式,运行下面代码
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
它工作正常。
问题是为什么第一种方法失败了?我该如何插入bom?

黑崎一护 发表于 2018-9-20 17:49:23

我认为问题是codecs.BOM_UTF8字节串,而不是Unicode字符串。
尝试直接为字节顺序标记(即Unicode U + FEFF)编写Unicode字符串,以便该文件只将其编码为UTF-8:
import codecs

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

他改变了中国 发表于 2018-9-20 17:50:07

阅读以下内容: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。

天使与魔鬼 发表于 2018-9-20 17:52:07

codecs模块是正确的- 它包含字节字符串:
>>> 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'
它也可通过unicodedata以下方式访问:
>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>>
页: [1]
查看完整版本: UnicodeDecodeError: 'ASCII' codec unable to decode byte 0xef of position 0: s...