python unicode编码/解码函数的异常(为什么不错误=忽略实际忽略它们?)

时间:2010-04-21 02:30:03

标签: python unicode

有人知道为什么字符串转换函数会在error =“ignore”传递时抛出异常吗?如何在不抛出错误的情况下将常规Python字符串对象转换为unicode?非常感谢!

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

返回
追溯(最近的呼叫最后):
  文件“”,第1行,在中   文件“/usr/lib/python2.6/codecs.py”,第686行,写入     return self.writer.write(data)
  文件“/usr/lib/python2.6/codecs.py”,第351行,写入     data,consume = self.encode(object,self.errors)
UnicodeDecodeError:'ascii'编解码器无法解码位置0中的字节0xd0:序数不在范围内(128)

编辑 - 感谢您的回复,但有没有人知道如何转换上面的文字,而不是使用“u”前缀?原因是你当然可以处理一些不稳定的事情:)

4 个答案:

答案 0 :(得分:3)

write方法(在Python 2中)接受一个unicode对象,然后你传递一个str - 所以encode第351行中的codecs.py调用首先尝试构建一个unicode对象(使用默认的编解码器'ascii')。修复很简单:将write调用更改为

write(u'кошка')

u前缀告诉Python你正在使用Unicode对象,它应该没问题。

答案 1 :(得分:2)

非解决方案(来自问题作者)我刚刚发现:使用python3

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

答案 2 :(得分:2)

在Python 2.x中使用 write('кошка'.decode('utf-8')而不是 write('кошка')

您也可以使用其他编码而不是'utf-8'。

希望它不会引起任何错误...

答案 3 :(得分:1)

问题在这里===>>>>写( 'кошка')

您正在编写一个str对象,收件人期待一个unicode对象,因此它尝试使用默认编码(ascii)将其转换为unicode,当然(?)生成众所周知的(?){{ 1}}

使用这样的编解码器模块的关键是让它将你的 unicode 对象转换成动态的utf8编码 - 所以给它 unicode < / p>

更新如何转换文字或非文字:

unicode_object = literal_or_whatever.decode(“UNKNOWN_ENCODING”)

你知道你的文字是如何编码的吗?你想告诉我们你想要完成什么吗?使用UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position 0: ordinal not in range(128)的一个班轮没有多大帮助; - )