我正在为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
提前感谢您的帮助。我很难过这个。
答案 0 :(得分:4)
您应该采取一些措施来解决这个问题。
将包含非ASCII字符的所有字符串文字转换为Unicode文字。示例:u'über'
。
对Unicode进行中间处理。换句话说,如果您收到编码字符串(无论编码),请在处理之前将其解码为Unicode。例如:
s = utf8_string.decode('utf8') + latin1_string.decode('latin1')
输出字符串或将其发送到某处时,请使用接收器理解的编码对其进行编码。示例: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'))
答案 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中吗?