Jad*_*d S 2 python unicode character-encoding python-2.7
所以我有一个message从未知编码的文件中读取的。我想发送到网页进行显示。我已经对UnicodeErrors进行了很多努力,并在StackOverflow上进行了许多问答,并认为我对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")
Run Code Online (Sandbox Code Playgroud)
然后,将返回的消息转储到JSON中并发送到前端。
我以为是因为我errors="replace"在最后一次使用,所以我try except会避免使用一些“?”来避免异常。显示器上的字符。可以接受的费用。
但是,似乎我太抱有希望,对于某些文件,我仍然UnicodeDecodeException对某些字符说“ ascii编解码器无法解码”。为什么errors="replace"不只照顾这个呢?
(作为一个额外的问题,ascii与其中任何一个有什么关系?。我指定的是UTF-8)
您不应该UnicodeDecodeError拥有errors='replace'。也str.decode('latin-1')绝不应该失败,因为ISO-8859-1对于每个可能的字节序列都有一个有效的字符映射。
我怀疑这message已经是一个unicode字符串,而不是字节。Unicode文本已从字节“解码”,并且无法再解码。
当你调用.decode()的一个unicode字符串,Python 2的尝试是有益的,决定编码 Unicode字符串回字节(使用默认编码),让你有东西,你真的可以解码。此隐式编码步骤不使用errors='replace',因此,如果Unicode字符串中的任何字符都未使用默认编码(可能是ASCII),则将获得一个。UnicodeEncodeError
(Python 3不再这样做,因为这非常令人困惑。)
检查的类型,message并假设它确实是Unicode,然后从那里回去找到解码的位置(可能是隐式的),以正确的解码替换该位置。