处理Python Unicode字符串中的错误编码字符
我正在处理一个叫python-lastfm的库返回的unicode字符串。
我猜这个库在某个环节处理编码时出了问题,返回了一个可能包含无效字符的unicode字符串。
比如,我期望在变量a中得到的原始字符串是“Glück”。
>>> a u'Gl\xfcck' >>> print a Traceback (most recent call last): File "", line 1, in UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)
\xfc是一个转义值252,它对应于“ü”的latin1编码。某种原因,这个值被嵌入到unicode字符串中,导致python无法正常处理。
我该如何把它转换回一个正常的unicode字符串,里面包含原来的“Glück”?我试着用decode和encode方法,但要么遇到了UnicodeEncodeError,要么得到的字符串里还是包含了序列\xfc。
5 个回答
4
在你的代码开头,也就是导入库之后,添加这三行代码。
import sys # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')
这样做会把系统默认的编码(ascii)替换成你程序运行期间的编码。
补充说明:除非你非常清楚这样做的后果,否则不建议这么做,下面的评论也有相关信息。这个帖子也很有帮助:使用 sys.setdefaultencoding('utf-8') 的风险
12
你需要把你的unicode字符串转换成标准字符串,可以使用一些编码方式,比如utf-8:
some_unicode_string.encode('utf-8')
除此之外:这个问题是重复的,和下面这个问题相似:
使用BeautifulSoup的findall方法时,带有类属性的unicode编码错误
而且在StackOverflow上还有至少十个相关的问题。建议先做一下研究。
9
你的unicode字符串没问题:
>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'
你在交互式提示符下看到的问题是,解释器不知道该用什么编码来把字符串输出到你的终端,所以它退回到使用“ascii”编码。但是,这种编码只懂得处理ASCII字符。对我来说在我的机器上运行得很好(因为我的系统输出编码是“UTF-8”——可能是因为我的环境变量设置和你的不同)
>>> print u'Gl\xfcck'
Glück