Python,UnicodeDecodeError 尝试打印包含非 ascii 字符的异常

标签 python python-2.7 unicode encoding utf-8

当我收到异常 cPickle.UnpicklingError: invalid load key, 'ÿ'. 并尝试打印它时,当我尝试将其插入我的 ( unicode)错误消息:

try:
    settings = _load()
except cPickle.UnpicklingError, err:
    msg = _(u"Error reading ... (the error is: '%s')")
    cont = askYes(msg % err, _(u"Settings Load Error")) # raises

尝试了 msg % unicode(err.message,encoding='utf-8') 中的解决方法,但显然 err.message 不是有效的 unicode 字符串(“UnicodeDecodeError”) : 'utf8' 编解码器无法解码位置 19 中的字节 0xff:无效起始字节")

那么处理这个问题最Pythonic的方法是什么?我应该将“忽略”或“替换”传递给 unicode() 吗?

编辑:askYes(None, msg % repr(err), _(u"Settings Load Error")) 给出类似以下内容:

(the error is: 'UnpicklingError("invalid load key, '\xff'.",)'). # ff is ÿ

不吹但仍然...

Edit2:我报告的错误与人为错误有点混淆:

u'%s' % "cPickle.UnpicklingError: invalid load key, 'ÿ'."
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 44: ordinal \
    not in range(128)

这是来自 pycharm 内部的解释器 - 显然 ÿ'\xc3\xbf' (...)

最佳答案

确保您可以在错误消息中看到结果的一种方法是使用 repr ,或者更直接 %r而不是%s :永远不会失败(因为任何对象都有一个表示,并且所有表示都是 ASCII 格式,包括可能的转义序列),并且还显示(作为转义序列)否则可能不可见的字符。

repr (以及旧式格式字符串中的 '%r')委托(delegate)给对象类型的 __repr__特殊方法;每个对象类型负责知道如何用明确的(不一定是 super 可读的)ASCII 字符串最好地表示自己。字符串和字节序列尤其擅长这一点,因此 repr super 适合他们。

OP 已经做到了这一点,但不喜欢结果的美观(在 reprerr.messagereprerr 之间变化)。不幸的是,对于repr来说,美观是最不重要的。 :相反,这都是关于完整、明确的信息。

另一个想法是使用永不失败的编码进行解码(解码每个字节,尽管可能解码为上下文中无意义的字形),例如“iso-8859-1”。但这并没有比repr有真正的改进。 , 我相信;审美上的提升颇值得商榷,在“完整、明确的信息”方面存在损失的可能性。

关于Python,UnicodeDecodeError 尝试打印包含非 ascii 字符的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27652804/

相关文章:

python - 启动 http web 服务器然后打开浏览器

python - 在不同目录中执行批处理文件

python - 如何将 pandas 列分配给其他列,或者如果为 nan 则为默认值?

python - 如何 git 安装而不是 pip 安装?

google-app-engine - Google App Engine 上的 500 服务器错误,不知道为什么

javascript - 有没有更简单的方法将 int 转换为 unicode?

PHP mb_substr 划分错误 utf 8

ruby - 在 Ruby 中将 Unicode 数字转换为整数

python - Pandas:在分组数据框中选择一天频率的倍数的日期?

python - 如何在 python 中为线程或进程设置内存限制?