我在爬网时遇到了一些非常麻烦的字符串。特别是,一个页面宣传为 is UTF-7
,尽管它并不完全UTF-7
是问题所在。我不关心表达文本的确切意图,但我只需要进入UTF-8
下游消费。
我面临的奇怪之处是我能够得到一个unicode
不能先UTF-8
编码然后解码的字符串。我已经尽可能多地提取字符串,同时仍然显示错误:
bytes = [43, 105, 100, 41, 46, 101, 95, 39, 43, 105, 100, 43]
string = ''.join(chr(c) for c in bytes)
# This particular string happens to be advertised as UTF-7, though it is
# a bit malformed. We'll ignore these errors when decoding it.
decoded = string.decode('utf-7', 'ignore')
# This decoded string, however, cannot be encoded into UTF-8 and back:
error = decoded.encode('utf-8').decode('utf-8')
我已经在许多系统上成功地尝试过这个:Mac 10.5.7 上的 Python 2.7.1 和 2.6.7,CentOS 上的 Python 2.7.2 和 2.6.8。不幸的是,在我们需要它工作的机器上,Ubuntu 12.04 上的 Python 2.7.3 失败了。在失败的系统上,我看到:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf7 in position 4: invalid start byte
以下是我在工作系统与非工作系统上看到的一些中间值:
# Working:
>>> repr(decoded)
'u".e_\'\\u89df"'
>>> repr(decoded.encode('utf-8'))
'".e_\'\\xe8\\xa7\\x9f"'
# Non-working:
>>> repr(decoded)
'u".e_\'\\U089d89df"'
>>> repr(decoded.encode('utf-8'))
'".e_\'\\xf7\\x98\\xa7\\x9f"'
两者在第一次编码后有所不同,但为什么对我来说仍然是个谜。我想这是缺少一些字符表或辅助库的问题,因为看起来 2.7.2 和 2.7.3 之间的任何东西都不能解释这种行为。在它正常工作的系统上,打印 unicode 实体会显示一个中文符号,但在系统上它不会显示一个占位符。
这让我想到了一个问题:这样的问题对任何人来说都很熟悉吗,或者是否有人知道我在出现问题的系统上可能缺少哪些支持库?