如何正确使用python中的unicode字符以防止出错?

时间:2010-02-10 17:36:51

标签: python unicode encoding ascii

我正在为Google Quick Search Box制作一个python插件,并且它使用非ascii字符做了一些奇怪的事情。看起来代码工作正常,直到我尝试构造一个包含非ascii字符的字符串(ü一直是我的测试字符)。我使用以下代码片段进行构造,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 -*-

我有。当我将构造字符串的代码片段拉入新脚本时,它可以正常工作。但由于某种原因,在其他代码的上下文中,它每次都会失败。我唯一能想到的是它是因为它在它自己的类中,但这对我没有任何意义。

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

提前感谢您的帮助。我很难过这个。

3 个答案:

答案 0 :(得分:4)

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

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

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

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

  4. 完整示例:

    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'))
    

答案 1 :(得分:1)

我猜你正在使用Python 2.x。

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

您应该将所有字符串作为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'

答案 2 :(得分:0)

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

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