Python Unicode 编码/解码函数中的异常 (为什么 errors=ignore 并没有忽略它们??)

8 投票
4 回答
6444 浏览
提问于 2025-04-15 21:51

有没有人知道为什么当传入参数errors="ignore"时,字符串转换函数会抛出异常?我该如何将普通的Python字符串对象转换为unicode,而不出现错误呢?非常感谢!

python -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')"

返回的内容是:
追踪记录(最近的调用在最前面):
文件 "", 第 1 行,
文件 "/usr/lib/python2.6/codecs.py",第 686 行,在 write 中
return self.writer.write(data)
文件 "/usr/lib/python2.6/codecs.py",第 351 行,在 write 中
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' 编解码器无法解码位置 0 的字节 0xd0:序号不在范围内(128)

编辑 -- 感谢大家的回复,但有没有人知道如何转换上面的字面量,而不使用 "u" 前缀?原因是你可能在处理一些不是常量的东西 :)

4 个回答

2

一个非解决方案(来自提问者)我刚刚发现:使用python3

python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')"
3

在Python 2中,write方法需要一个unicode对象,但你传给它的是一个字符串(str)。所以在codecs.py的第351行,encode调用首先试图创建一个unicode对象(使用默认的编码方式,'ascii')。解决这个问题很简单:把write的调用改成

write(u'кошка')

这里的u前缀告诉Python你正在使用一个Unicode对象,这样就没问题了。

3

在Python 2.x中,使用 write('кошка'.decode('utf-8')) 代替 write('кошка')

你也可以使用其他编码方式,而不仅仅是'utf-8'。

希望这样不会出现任何错误……

撰写回答