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

处理Python unicode字符串中错误编码的字符,python,string,unicode,character-encoding,Python,String,Unicode,Character Encoding,我正在处理python lastfm库返回的unicode字符串 我假设在某种程度上,库的编码错误,并返回可能包含无效字符的unicode字符串 例如,我希望变量a中的原始字符串是“Glück” >>>a u'Gl\xfcck' >>>打印 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 UnicodeEncodeError:“ascii”编解码器无法对位置2中的字符u'\xfc'进行编码:序号不在范围内(128) \xfc是转义值252,它对应于“ü”的拉丁1编码。不知何故,这以pyth

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

我假设在某种程度上,库的编码错误,并返回可能包含无效字符的unicode字符串

例如,我希望变量a中的原始字符串是“Glück”

>>>a u'Gl\xfcck' >>>打印 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 UnicodeEncodeError:“ascii”编解码器无法对位置2中的字符u'\xfc'进行编码:序号不在范围内(128) \xfc是转义值252,它对应于“ü”的拉丁1编码。不知何故,这以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”——可能是因为我的环境变量设置与您的不同)


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

some_unicode_string.encode('utf-8')
除此之外:这是一场骗局

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

不要将从模型字段获得的内容转换为字符串,只要它已经是unicode字符串。
(哎呀,我完全没有注意到它与django无关)

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

import sys  # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')
它将覆盖程序过程中的系统默认编码(ascii)


编辑:除非您确定后果,否则不应该这样做,请参见下面的评论。这篇文章也很有帮助:

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

您使用的是什么版本的Python?什么操作系统?什么是
sys.stdout.encoding
?可能重复@RestRisiko:和其他几十个问题事实上,Mac和现代Linux台式机默认使用UTF-8控制台,因此这一切正常。另一方面,Windows控制台的标准C库接口上有一些特定于语言环境的代码页,其中没有一个是UTF-8。Windows控制台上的非ASCII字符都是试用字符。@Bobince:Windows控制台使用的“少数特定于语言环境的代码页”中最流行的是cp850,它与其他基于拉丁语的代码页一样,非常乐意正确显示u-umlaut。如果确实将ummapped Unicode字符发送到Windows控制台,则不会收到OP消息中有关ascii编解码器的内容。例如,在位置2:字符映射到时,您会发现UnicodeEncodeError:“charmap”编解码器无法对字符u'\u9876'进行编码。。。我们仍然不知道为什么OP会出错,永远不要这样做。
import sys  # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('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)
>>> print("Word read was: {}".format(utf8_word.encode('utf-8')))
Word read was: Glück