Python2:使用带有errors ='replace'的.decode仍会返回错误

时间:2016-10-13 19:07:19

标签: python python-2.7 unicode character-encoding

所以我有一个message从一个未知编码的文件中读取。我想发送到网页进行展示。我已经使用UnicodeErrors进行了很多努力,并且已经经历了很多关于StackOverflow的Q& As,并认为我对Unicode和编码的工作方式有了很好的理解。我目前的代码看起来像这样

try :
            return message.decode(encoding='utf-8')
        except:
            try:
                return message.decode(encoding='latin-1')
            except:
                try:
                    print("Unable to entirely decode in latin or utf-8, will replace error characters with '?'")
                    return message.decode(encoding='utf-8', errors="replace")

然后将返回的消息转储到JSON中并发送到前端。

我认为是因为我在最后errors="replace"上使用了try except,我会避免例外而牺牲一些“?”我的显示中的字符。可接受的费用。

然而,似乎我太有希望了,对于某些文件,我仍然得到UnicodeDecodeException说“ascii编解码器无法解码”某些字符。为什么errors="replace"没有处理这个问题?

(同样作为奖励问题,ascii与其中任何一个有什么关系?..我指的是UTF-8)

2 个答案:

答案 0 :(得分:3)

您不应该使用UnicodeDecodeError获得errors='replace'。同样str.decode('latin-1')也不应该失败,因为ISO-8859-1对每个可能的字节序列都有一个有效的字符映射。

我怀疑message已经是unicode字符串,而不是字节。 Unicode文本已经从字节“解码”,不能再被解码。

当您致电.decode()一个unicode字符串时,Python 2会尝试提供帮助并决定 Unicode字符串重新编码为字节(使用默认编码),所以你有一些你可以真正解码的东西。这个隐式编码步骤不会使用errors='replace',因此如果Unicode字符串中的任何字符都不是默认编码(可能是ASCII),那么你就是&#39 ;得到UnicodeEncodeError

(Python 3不再这样做,因为它非常令人困惑。)

检查message的类型并假设它确实是Unicode,从那里开始工作以找到解码的位置(可能是隐式的),用正确的解码替换它。

答案 1 :(得分:0)

解码错误替换实现'替换'错误处理(仅限文本编码):替换'?'用于编码错误(由编解码器编码)和' \ ufffd' (Unicode替换字符)用于解码错误

文本编码是指A"编解码器,它将Unicode字符串编码为字节。"

也许您的数据格式不正确 - 您应该尝试忽略'错误处理,忽略格式错误的数据,继续编码或解码,恕不另行通知。

message.decode(encoding='utf-8', errors="ignore")