处理Python Unicode字符串中的错误编码字符

19 投票
5 回答
43498 浏览
提问于 2025-04-16 16:16

我正在处理一个叫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

撰写回答