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字符串。(哎呀,我完全没想到这与姜戈无关)