所以我有一个消息
,它是从一个未知编码的文件中读取的。我想发送到网页进行显示。我与 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")
然后将返回的消息转储为 JSON 并发送到前端。
我假设因为我在最后一个 try except
上使用了 errors="replace"
,所以我将以牺牲一些 ' ?'我显示器中的字符。可接受的成本。
但是,似乎我抱太大希望了,对于某些文件,我仍然得到一个 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)中,你将得到一个 Unicode<strong>En</strong>codeError
.
(Python 3 不再这样做,因为它非常困惑。)
检查 message
的类型并假设它确实是 Unicode
,从那里返回找到它被解码的位置(可能是隐式的)以用正确的解码替换它。
关于Python2 : Using . decode with errors ='replace' 仍然返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40029017/