所以我有一个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)
答案 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")