繁体   English   中英

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

[英]Handle wrongly encoded character in Python unicode string

我正在处理由 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 的字符串。

您必须使用某种编码(例如 utf-8)将您的 unicode 字符串转换为标准字符串:

some_unicode_string.encode('utf-8')

除此之外:这是一个骗局

具有类属性的 BeautifulSoup findall-unicode 编码错误

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

你的 unicode 字符串很好:

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

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

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

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

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

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

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

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

我自己在处理一个包含德语单词的文件时偶然发现了这个错误,我不知道它是用 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM