查看: 1537|回复: 3

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

[复制链接]

15

主题

97

帖子

310

积分

论坛管理

Rank: 4

积分
310
发表于 2018-9-20 17:48:10 | 显示全部楼层 |阅读模式
当我运行下面代码时:
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?
回复

使用道具 举报

13

主题

53

帖子

131

积分

注册会员

Rank: 2

积分
131
发表于 2018-9-20 17:49:23 | 显示全部楼层
我认为问题是codecs.BOM_UTF8字节串,而不是Unicode字符串。
尝试直接为字节顺序标记(即Unicode U + FEFF)编写Unicode字符串,以便该文件只将其编码为UTF-8:
  1. import codecs

  2. file = codecs.open("lol", "w", "utf-8")
  3. file.write(u'\ufeff')
  4. file.close()
复制代码

回复

使用道具 举报

3

主题

31

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2018-9-20 17:50:07 | 显示全部楼层
阅读以下内容:http: //docs.python.org/library/codecs.html#module-encodings.utf_8_sig
做这个
  1. with codecs.open("test_output", "w", "utf-8-sig") as temp:
  2.     temp.write("hi mom\n")
  3.     temp.write(u"This has ♭")
复制代码

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

使用道具 举报

11

主题

63

帖子

159

积分

注册会员

Rank: 2

积分
159
发表于 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'
>>>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表