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

Handle wrongly encoded character in Python unicode string

我正在处理由python lastfm库返回的unicode字符串。

我假设在途中的某个地方,库会错误地进行编码,并返回一个可能包含无效字符的Unicode字符串。

例如,我在变量A中期望的原始字符串是"gl_ck"

1
2
3
4
5
6
>>> 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无法单独处理。

如何将其转换回包含原始"gl_ck"的普通或Unicode字符串?我尝试使用decode/encode方法,但要么得到一个unicodeencode错误,要么得到一个包含序列xfc的字符串。


必须使用某种编码将Unicode字符串转换为标准字符串,例如utf-8:

1
some_unicode_string.encode('utf-8')

除此之外:这是对

具有class属性的beautifulsoup findall-Unicode编码错误

以及至少十个相关问题。首先研究。


您的Unicode字符串正常:

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

您在交互提示中看到的问题是,解释器不知道使用什么编码将字符串输出到终端,因此它返回到"ascii"编解码器——但该编解码器只知道如何处理ascii字符。它在我的机器上运行良好(因为sys.stdout.encoding对我来说是"utf-8"--可能是因为类似我的环境变量设置与您的不同)

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


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

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

它将覆盖程序进程中的系统默认编码(ASCII)。

编辑:你不应该这样做,除非你确定后果,见下面的评论。这篇文章也很有帮助:sys.setdefaultencoding("utf-8")的危险性


不要将模型字段中的内容强制转换为字符串,只要它已经是Unicode字符串。(哎呀,我完全没想到这与姜戈无关)