python unicode编码/解码函数的异常(为什么';t errors=ignore实际上忽略了它们??)

python unicode编码/解码函数的异常(为什么';t errors=ignore实际上忽略了它们??),python,unicode,Python,Unicode,有人知道为什么字符串转换函数在传递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行,写入

有人知道为什么字符串转换函数在传递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行,写入
返回self.writer.write(数据)
文件“/usr/lib/python2.6/codecs.py”,第351行,写入
数据,消耗=self.encode(对象,self.errors)
UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0xd0:序号不在范围内(128)


编辑——感谢您的回复,但是有人知道如何转换上面的文字,而不是使用“u”前缀吗?原因是,您当然可以处理一些非常量的内容:)

方法(在Python 2中)使用unicode对象,您将向其传递一个str-
encode
调用
codecs.py
行351首先尝试构建一个unicode对象(使用默认的编解码器“ascii”)。修复很简单:将
write
调用更改为

write(u'кошка')

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

这里的问题是===>>>>写入('Сааа')

您正在编写一个str对象,收件人需要一个unicode对象,因此它尝试使用默认编码(ascii)将其转换为unicode,这当然(?)会产生众所周知的(?)UnicodeDecodeError:“ascii”编解码器无法对0位的字节0xXX进行解码:序号不在范围内(128)

像这样使用编解码器模块的全部目的是让它将unicode对象转换为动态编码的utf8——所以将其输入unicode

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

unicode\u object=literal\u或\u whatever.decode(“未知\u编码”)

你知道你的文字是如何编码的吗?你想告诉我们你想要完成什么吗?使用
python-c
的一行程序没有多大帮助;-)

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

python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')"
在Python2.x中,使用write('Кааа)。decode('utf-8')而不是write('Сааааа')

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


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

unicode()函数不起作用,它会抛出相同的异常。@gatoatigrado:我说的是以unicode方式输入它;我没有说要使用
unicode()
函数。如果使用
unicode()
而不指定编码,它当然会得到相同的异常(默认编码是ascii)。请阅读我答案的最后一句。啊,对不起,我正在扫描,对不起。问题是“如何”从Python字符串以unicode方式输入。逻辑方法是
unicode(pystr)
,但这不起作用。我想我以前对bytes()使用过愚蠢的技巧,但我想知道真正的解决方案是什么。@gatoatigrado:unicode(str_对象)正如前面所解释的,它不是“逻辑”方式(不管它是什么意思)——您需要知道str_对象的编码方式(例如“cp1252”),然后执行
str_对象。encode(该编码)
unicode(str_对象,该编码)
(这些是等效的)这是更好的答案,它提供了与Python3的向前兼容性。