【问题标题】:How do I properly work with unicode characters in python to keep from getting errors?如何在 python 中正确使用 unicode 字符以防止出错?
【发布时间】:2010-02-10 17:36:50
【问题描述】:

我正在为 Google 快速搜索框开发一个 python 插件,它对非 ascii 字符做了一些奇怪的事情。在我尝试构建一个包含非 ascii 字符的字符串之前,代码似乎工作正常(ü 一直是我的测试字符)。我正在使用以下代码 sn-p 进行构造,其中 new_task 作为从 GQSB 输入的变量。

the_sig = ("%sapi_key%sauth_token%smethod%sname%sparse%stimeline%s" %
           (api_secret, api_key, the_token, method, new_task, doParse, timeline))

它给了我这个错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置 0 的字节 0xc3:序数不在范围内 (128)

我理解正确,这是因为我试图在 ascii 字符串中将一个 unicode 字符串在一起。我能找到的一切都告诉我在顶部声明编码:

# -*- coding: iso-8859-15 -*-

我有。当我将构造字符串的代码 sn-p 拉到一个新脚本中时,它工作得很好。但是由于某种原因,在其余代码的上下文中,它每次都会失败。我唯一能想到的是,这是因为它在它自己的类中,但这对我来说没有任何意义。

完整代码可以在 GitHub 上找到here

提前感谢您的帮助。我被这个难住了。

【问题讨论】:

    标签: python unicode encoding ascii


    【解决方案1】:

    您应该采取一些措施来解决此问题。

    1. 将所有包含非 ASCII 字符的字符串文字转换为 Unicode 文字。示例:u'über'

    2. 对 Unicode 进行中间处理。换句话说,如果您收到一个编码字符串(无论编码如何),请在处理之前将其解码为 Unicode。示例:

      s = utf8_string.decode('utf8') + latin1_string.decode('latin1')
      
    3. 在输出字符串或将其发送到某处时,请使用您的接收器可以理解的编码对其进行编码。示例:send(s.encode('utf8'))

    完整示例:

    input1 = get_possibly_nonascii_input().decode('iso-8859-1')
    input2 = get_possibly_nonascii_input().decode('iso-8859-1')
    input3 = u'üvw'
    
    s =  u'%s -> %s' % (input3, (input1 + input2).upper())
    
    send_output(s.encode('utf8'))
    

    【讨论】:

    • 太棒了。这行得通。我必须解码,然后重新编码为 utf 8 以将其发送到 hashlib。非常感谢。看起来它现在正在工作。
    【解决方案2】:

    我猜你使用的是 Python 2.x。

    文件编码声明指定解释器如何读取字符串文字

    您应该将所有字符串处理为 unicode 值,而不是 str 值。如果你从外界读到str,你应该将它显式解码为unicode。这同样适用于输出字符串。

    # -*- coding: utf-8 -*-
    u_dia_str = '\xc3\xbc'   # str
    lambda_unicode = u'λ'    # unicode
    
    # input value
    u_dia = u_dia_str.decode('utf-8')
    
    sig_unicode = u'%s%s' % (u_dia, lambda_unicode)
    # => u'üλ'
    
    # output value
    sig_str = sig_unicode.encode('utf-8')
    # => '\xc3\xbc\xce\xbb'
    

    【讨论】:

    • 好的,我将输入解码为 utf-8,现在我可以通过那部分了。但在那之后,我立即将字符串编码为 md5 哈希: hashed_sig = hashlib.md5(the_sig).hexdigest() 现在我得到与以前相同的 ascii 编解码器错误。这是hashlib的限制吗?还是我还是做错了什么?
    • 没关系。知道了。我没有意识到我必须重新编码。感谢您的帮助。
    【解决方案3】:

    这有点超出我的专业知识,但我认为顶部的 # -*- coding: iso-8859-15 -*- 声明了保存 Python 源文件的文本编码。

    真的保存在 iso-8859-15 中吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多