【问题标题】:exceptions with python unicode encode/decode functions (why doesn't errors=ignore actually ignore them??)python unicode编码/解码函数的异常(为什么errors=ignore实际上不忽略它们??)
【发布时间】:2010-04-21 02:30:03
【问题描述】:

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

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

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    write 方法(在 Python 2 中)采用一个 unicode 对象,并且您将它传递给一个 str ——因此,codecs.py 第 351 行中的 encode 调用首先尝试构建一个 unicode 对象(使用默认编解码器,'ascii')。修复很简单:将 write 调用更改为

    write(u'кошка')
    

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

    【讨论】:

    • 这是更好的答案。它提供与 Python 3 的前向兼容性。
    【解决方案2】:

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

    您也可以使用其他编码来代替“utf-8”。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        您正在编写一个 str 对象,接收者期待一个 unicode 对象,因此它尝试使用默认编码 (ascii) 将其转换为 unicode,当然 (?) 会产生众所周知的 (?) @987654321 @

        像这样使用编解码器模块的全部意义在于让它即时将您的 unicode 对象转换为 utf8 编码的对象——所以输入它 unicode

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

        unicode_object = literal_or_whatever.decode("UNKNOWN_ENCODING")

        你知道你的文字是如何编码的吗?你想告诉我们你想要完成什么吗?一个带有python -c 的衬里并没有多大帮助;-)

        【讨论】:

        • unicode() 函数不起作用,它会抛出相同的异常。
        • @gatoatigrado:我说喂它 unicode;我没有说要使用unicode() 函数。如果您使用unicode() 而不指定编码,当然它会得到相同的异常(默认编码是ascii)。请阅读我回答的最后一句话。
        • 啊,对不起,我正在扫描,对不起。问题是“如何”从 Python 字符串中输入 unicode。合乎逻辑的方式是unicode(pystr),但这不起作用。我想我以前用过 bytes() 的愚蠢技巧,但我想知道真正的解决方案是什么。
        • @gatoatigrado: unicode(str_object) 正如已经解释的那样不是“逻辑”方式(无论这意味着什么)——你需要知道你的 str_object 是什么编码(例如“cp1252”),并且然后执行str_object.encode(that_encoding)unicode(str_object, that_encoding)(这些是等效的)
        猜你喜欢
        • 2019-10-22
        • 2018-09-07
        • 2020-06-04
        • 2019-12-19
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多