在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的字符串。
你的unicode字符串的罚款:
>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'
你在交互提示中看到的问题是,解释不知道用什么编码输出字符串到终端,所以它回落到“ascii”编解码器 - 但是编解码器只知道如何处理ASCII字符。它的工作原理在我的机器上的罚款(因为sys.stdout.encoding是“UTF-8”我 - 很可能是因为像我的环境变量设置不同于您)
>>> print u'Gl\xfcck'
Glück
事实上,Mac和现代Linux桌面默认使用UTF-8控制台,所以这是正常的。另一方面,Windows控制台的标准C库接口仍然存在一些特定于语言环境的代码页,其中没有一个是UTF-8。Windows控制台上的非ASCII字符总是一个试用版。 – bobince 2011-04-23 11:59:12
@Bobince:用于Windows控制台的“极少数特定于语言环境的代码页”中最流行的是cp850,与其他基于拉丁语的代码相似,它很乐意正确显示u-umlaut。如果您确实将unmmapped Unicode字符发送到Windows控制台,则不会收到OP的消息讨论** ascii **编解码器的问题。你得到'UnicodeEncodeError:'charmap'编解码器不能编码字符u'\ u9876'在位置2:字符映射到
你有你的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')
不要这样做。 http://*.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script – 2016-09-05 11:49:18
你使用的是什么版本的Python? – 2011-04-22 23:30:16
什么操作系统?什么是“sys.stdout.encoding”? – 2011-04-22 23:43:08
[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