Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中正确使用unicode字符以避免出错?_Python_Unicode_Encoding_Ascii - Fatal编程技术网

如何在python中正确使用unicode字符以避免出错?

如何在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_

我正在为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上找到


提前感谢您的帮助。这个问题让我很困惑。

这有点超出了我的专业知识,但我认为顶部的
#-*-编码: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'

要解决这个问题,您应该做一些事情

  • 将包含非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'))
    

    好的,我将输入解码为utf-8,现在我可以通过该部分了。但紧接着,我用以下代码将字符串编码为md5哈希:hashed_sig=hashlib.md5(the_sig).hexdigest(),现在我得到了与之前相同的ascii编解码器错误。这是hashlib的一个限制吗?还是我还在做错事?别担心。知道了。我没有;我没有意识到我必须重新编码。谢谢你的帮助,太棒了。这起作用了。我必须解码,然后重新编码到UTF8以将其发送到hashlib。谢谢。看起来它现在正在工作。