【发布时间】:2015-02-23 12:15:08
【问题描述】:
当我收到cPickle.UnpicklingError: invalid load key, 'ÿ'. 的异常并尝试打印它时,当我尝试将它插入到我的(unicode)错误消息中时,它会引发一个 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' codec can't decode byte 0xff in position 19: invalid start byte”)
那么处理这个问题的最 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,是显示可疑内容字符串的最佳方式——它可能或可能不是用来表示Unicode,但您显示的\x0f或您之前提到的0xff都会对编码进行思考。如果err.message是一个没有韵律或理由的随机字节集合,你怎么能比repr更好地显示它?!ignore或replace会隐藏潜在的宝贵信息以用于调试目的 - 切勿在错误消息中这样做! -
@AlexMartelli:谢谢-是的,我不会使用替换和合作-我只是想吓唬人们,所以他们回答我:D。您能否详细说明
repr- 使用 repr(err.message) 会更好吗?我会很感激一个完整的答案 -
@AlexMartelli: repr(err.message):
(the error is: '"invalid load key, '\x0f'."')而 repr(err):(the error is: 'UnpicklingError("invalid load key, '\x0f'.",)')。我宁愿在`(错误是:UnpicklingError:“无效的加载键,'\x0f'。”)'行中有一些东西-我必须手动构造它吗?我也承认 为什么repr()设法解码字符串让我无法理解。 -
字符串中似乎没有任何 Unicode 问题,如下所示:
'\x0f'没有出现这样的问题——而'\xff'会出现。尝试将 err.message 解码为“iso-8859-1”,这不会失败(它会解码每个字节,尽管可能会解码为无意义的字形),您可能会了解更多信息。顺便说一句,repr没有问题也就不足为奇了——repr永远不会失败——让我困惑的是'\xff'和'\x0f'之间的炼金术转换! -
@AlexMartelli: 抱歉-我可能已经转换了错误消息-显然
err.message在“UnicodeDecodeError: 'utf8' codec...position 19”中是invalid load key, ' + chr(0xff)。为什么 repr 永远不会失败?它使用 iso-8859-1 吗?
标签: python python-2.7 unicode encoding utf-8