Python2 : Using . decode with errors ='replace' 仍然返回错误

标签 python python-2.7 unicode character-encoding

所以我有一个消息,它是从一个未知编码的文件中读取的。我想发送到网页进行显示。我与 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)

最佳答案

你不应该得到 UnicodeDecodeErrorerrors='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/

相关文章:

python - 在 python 2.6 中创建字典的字典

Python Pandas : Counting keys and summing up their values in a data frame

python - 我想要第 6 列值的总和

c++ - 如何从控件中正确检索 Unicode 文本?

Python 得到错误的 UTF-8 字符编码?

python - 解析现有的配置文件

python - 在使用 Sphinx 文档时,我应该告诉我的 VCS 忽略哪些文件?

windows - 当 Gtk 和 win32ui 模块都导入时,Python.exe 在关闭 Gtk.main() 后继续运行

python - 在 Python 中对混合列表进行排序

string - python : Printing unicode characters beyond FFFF