首页 文章

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

提问于
浏览
14

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

4 回答

  • 12

    你的unicode字符串很好:

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

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

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

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

    some_unicode_string.encode('utf-8')
    

    除此之外:这是一个骗局

    BeautifulSoup findall with class attribute- unicode encode error

    关于SO的至少十个其他相关问题 . 研究第一 .

  • 0

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

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

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

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

  • 7

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

相关问题