如何在python中正确使用unicode字符以避免出错?
我正在为Google Quick Search Box开发一个python插件,它使用非ascii字符做一些奇怪的事情。在我尝试构造一个包含非ascii字符的字符串(ü一直是我的测试字符)之前,代码似乎运行良好。我使用下面的代码片段进行构造,将new_task作为从GQSB输入的变量如何在python中正确使用unicode字符以避免出错?,python,unicode,encoding,ascii,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_
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上找到
提前感谢您的帮助。这个问题让我很困惑。这有点超出了我的专业知识,但我认为顶部的
#-*-编码:iso-8859-15-*-
声明了Python源文件保存的文本编码
它真的保存在iso-8859-15中了吗?我猜您使用的是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'
要解决这个问题,您应该做一些事情
u'über'
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'))
好的,我将输入解码为utf-8,现在我可以通过该部分了。但紧接着,我用以下代码将字符串编码为md5哈希:hashed_sig=hashlib.md5(the_sig).hexdigest(),现在我得到了与之前相同的ascii编解码器错误。这是hashlib的一个限制吗?还是我还在做错事?别担心。知道了。我没有;我没有意识到我必须重新编码。谢谢你的帮助,太棒了。这起作用了。我必须解码,然后重新编码到UTF8以将其发送到hashlib。谢谢。看起来它现在正在工作。