2010-04-21 71 views
5

有没有人知道为什么字符串转换函数在错误=“忽略”通过时会抛出异常?我怎样才能从常规的Python字符串对象转换为unicode而不会引发错误?非常感谢!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”前缀?原因是你当然可以处理的东西不是一个常量:)

回答

2

在Python 2.x中使用写(” кошка'.decode( 'UTF-8')代替写( 'кошка')

您可以使用其他的编码过的不是 'UTF-8'。

希望它不会抛出任何错误...

3

write方法(在Python 2中)需要一个unicode对象,并且你将它传递给一个str - 所以encode调用codecs.py行351首先尝试构建一个unicode对象(使用默认编解码器'ascii')。修复很简单:改变write调用

write(u'кошка') 

u前缀告诉Python中,你正在使用一个Unicode对象,它应该是罚款。

+0

这是更好的答案。它提供了与Python 3的转发兼容性。 – Alan 2017-05-11 13:52:43

1

问题是在这里=== >>>>写(“кошка”)

你正在编写一个海峡对象,收件人期待一个Unicode对象,所以它会试图将其转换使用默认为Unicode编码(ASCII),这当然(?)产生众所周知的(?)UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position 0: ordinal not in range(128)

整个使用的编解码器模块类似的一点是要得到它对象转换您的统一为utf8编码上飞 - 所以喂它unicode

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

unicode_object = literal_or_whatever.decode( “UNKNOWN_ENCODING”)

你知道你的文字编码?你想告诉我们你想完成什么吗?一个一个内胆采用python -c没有太大的帮助;-)

+0

unicode()函数不起作用,它会抛出相同的异常。 – gatoatigrado 2010-04-21 02:56:17

+0

@gatoatigrado:我说要喂它unicode;我没有说使用'unicode()'函数。如果您在不指定编码的情况下使用'unicode()',OF COURSE将获得相同的异常(默认编码为ascii)。并请阅读我答案的最后一句。 – 2010-04-21 03:09:53

+0

啊,对不起,我正在扫描,对不起。问题是如何从Python字符串提供unicode。逻辑的方式是'unicode(pystr)',但这是行不通的。我认为我之前用过bytes(),但我想知道真正的解决方案是什么。 – gatoatigrado 2010-04-21 03:20:25

2

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

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

是的,Python 3支持本地unicode。 =] – 2010-04-21 14:04:55