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

时间:2011-04-22 23:18:52

标签: python string unicode character-encoding

我正在处理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编码。不知何故,它以一种python无法独立处理的方式嵌入到unicode字符串中。

如何将此转换为包含原始“Glück”的普通或unicode字符串?我尝试使用解码/编码方法,但要么得到了一个UnicodeEncodeError,要么是一个包含序列\ xfc的字符串。

5 个答案:

答案 0 :(得分:12)

您必须使用某些编码将您的unicode字符串转换为标准字符串,例如UTF-8:

some_unicode_string.encode('utf-8')

除此之外:这是一个

的骗局

BeautifulSoup findall with class attribute- unicode encode error

以及至少十个关于SO的其他相关问题。研究第一。

答案 1 :(得分:7)

您的unicode字符串很好:

>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'

您在交互式提示符中看到的问题是解释器不知道使用什么编码将字符串输出到终端,因此它回退到“ascii”编解码器 - 但该编解码器只知道如何处理ASCII字符。它在我的机器上工作正常(因为sys.stdout.encoding对我来说是“UTF-8” - 可能是因为我的环境变量设置与你的不同)

>>> print u'Gl\xfcck'
Glück

答案 2 :(得分:4)

在代码的开头,在导入之后,添加这3行。

import sys  # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')

它将覆盖程序课程的系统默认编码(ascii)。

编辑:除非您确定后果,否则不应该这样做,请参阅下面的评论。这篇文章也很有帮助:Dangers of sys.setdefaultencoding('utf-8')

答案 3 :(得分:0)

不要 str()强制转换为模型字段中的字符串,只要它已经是unicode字符串。 (哎呀我完全错过了它与django无关)

答案 4 :(得分:0)

我在处理包含我不知道它已经用UTF-8编码的德语单词的文件时碰巧发现了这个错误。当我开始处理单词时,问题就会显现出来,其中一些不会显示出解码错误。

# python
Python 2.7.12 (default, Aug 22 2019, 16:36:40) 
>>> utf8_word = u"Gl\xfcck"
>>> print("Word read was: {}".format(utf8_word))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)

我解决了在字符串上调用encode方法的错误:

>>> print("Word read was: {}".format(utf8_word.encode('utf-8')))
Word read was: Glück