Python Unicode 编码/解码函数中的异常 (为什么 errors=ignore 并没有忽略它们??)
有没有人知道为什么当传入参数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 个回答
一个非解决方案(来自提问者)我刚刚发现:使用python3
python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')"
在Python 2中,write
方法需要一个unicode对象,但你传给它的是一个字符串(str)。所以在codecs.py
的第351行,encode
调用首先试图创建一个unicode对象(使用默认的编码方式,'ascii')。解决这个问题很简单:把write
的调用改成
write(u'кошка')
这里的u
前缀告诉Python你正在使用一个Unicode对象,这样就没问题了。
在Python 2.x中,使用 write('кошка'.decode('utf-8')) 代替 write('кошка')。
你也可以使用其他编码方式,而不仅仅是'utf-8'。
希望这样不会出现任何错误……