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

问题描述:

我正在处理由python-lastfm库返回的unicode字符串。在Python unicode字符串中处理错误编码的字符

我假定某处路上,库的编码错误,并返回一个可能包含无效字符的unicode字符串。

例如,原来的字符串我在变量a期望是“格吕克”

 
>>> 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,其对应于“U”形的latin1编码。不知何故,这将以python无法自行处理的方式嵌入unicode字符串中。

如何将其转换回包含原始“Glück”的正常或unicode字符串?我尝试了解解码/编码方法,但是得到了一个UnicodeEncodeError或者包含序列\ xfc的字符串。

+0

你使用的是什么版本的Python? – 2011-04-22 23:30:16

+0

什么操作系统?什么是“sys.stdout.encoding”? – 2011-04-22 23:43:08

+0

[BeautifulSoup findall with class attribute-unicode encode error]可能的重复(http://*.com/questions/5746888/beautifulsoup-findall-with-class-attribute-unicode-encode-error) – 2011-04-23 05:48:43

你的unicode字符串的罚款:

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

你在交互提示中看到的问题是,解释不知道用什么编码输出字符串到终端,所以它回落到“ascii”编解码器 - 但是编解码器只知道如何处理ASCII字符。它的工作原理在我的机器上的罚款(因为sys.stdout.encoding是“UTF-8”我 - 很可能是因为像我的环境变量设置不同于您)

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

事实上,Mac和现代Linux桌面默认使用UTF-8控制台,所以这是正常的。另一方面,Windows控制台的标准C库接口仍然存在一些特定于语言环境的代码页,其中没有一个是UTF-8。Windows控制台上的非ASCII字符总是一个试用版。 – bobince 2011-04-23 11:59:12

+0

@Bobince:用于Windows控制台的“极少数特定于语言环境的代码页”中最流行的是cp850,与其他基于拉丁语的代码相似,它很乐意正确显示u-umlaut。如果您确实将unmmapped Unicode字符发送到Windows控制台,则不会收到OP的消息讨论** ascii **编解码器的问题。你得到'UnicodeEncodeError:'charmap'编解码器不能编码字符u'\ u9876'在位置2:字符映射到'......我们仍然不知道为什么OP得到了这个错误。 – 2011-04-23 13:14:09

你有你的unicode字符串转换成一个使用一些编码的标准字符串UTF-8:

some_unicode_string.encode('utf-8') 

除了:这是对SO

BeautifulSoup findall with class attribute- unicode encode error

和至少十个其他相关问题进行欺骗。首先研究。

不要str()强制将字符串转换为字符串,只要它是一个unicode字符串。 (oops我完全错过了,它不是Django相关的)

在代码的开始处,刚刚导入后,添加这3行。

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

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

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

+0

不要这样做。 http://*.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script – 2016-09-05 11:49:18