解码包含unicode字符的URL

解码包含unicode字符的URL,unicode,python-2.7,escaping,cherrypy,mako,Unicode,Python 2.7,Escaping,Cherrypy,Mako,我在Mako模板中有以下代码: <a href="#" onclick='getCompanyHTML("${fund.investments[inv_name].name | u}"); return false;'>${inv_name}</a> 然后,我使用investment_名称作为键返回到模板中提取它的同一词典 这适用于所有标准情况,例如公司名称中的空格、斜杠和单引号。但是,如果公司名称包含ascii字符集之外的unicode字符,则失败 例如,公司名称“E

我在Mako模板中有以下代码:

<a href="#" onclick='getCompanyHTML("${fund.investments[inv_name].name | u}"); return false;'>${inv_name}</a>
然后,我使用investment_名称作为键返回到模板中提取它的同一词典

这适用于所有标准情况,例如公司名称中的空格、斜杠和单引号。但是,如果公司名称包含ascii字符集之外的unicode字符,则失败

例如,公司名称“Eptisa Servicios de Ingeniería S.L.”的url呈现为“Eptisa+Servicios+de+Ingenier%C3%ADa+S.L.”当该值返回服务器时,我正在反转url转义,但显然无法正确解码unicode,因为我试图将结果用作字典键会产生一个键错误

我尝试在这两种形式中添加unicode解码,但运气不佳:

    investment_name = urllib.unquote_plus(investment_name.decode('utf-8'))
    investment_name = urllib.unquote_plus(investment_name.encode('raw_unicode_escape').decode('utf-8'))

有人能建议我必须做些什么才能将“Eptisa+Servicios+de+ingener%C3%ADa+S.L.”转换回“Eptisa-Servicios de ingenería S.L.”吗?

按相反顺序执行:先取消引用,然后
。解码('utf-8')

不要混合使用字节和Unicode字符串

例子 注意:
打印u
可能会产生Unicode错误。要解决此问题,请执行以下操作:

print u.encode(character_encoding_your_console_understands)
或者设置
pythonionecoding
环境变量


在Unix上,您可以尝试将
locale.getpreferredencoding()
作为字符编码,在Windows上,当我执行
urllib.unquote\u plus(投资名称)。解码('utf-8')
时,请参阅
chcp

的输出。然后我得到
UnicodedEncodeError:'ascii'编解码器无法在位置28-29编码字符:序号不在范围内(128)
来自.decode('utf-8')调用中的编解码器模块。@LarryLustig:尝试上面的代码示例。哪一行产生错误?是否打印u?正在尝试。我知道我不能将unicode字符串打印到我的术语中,但如果我能使解码工作正常,我应该会没事的(我将使用结果作为字典中的键进行确认)。谢谢你的帮助,很快就会有结果。结果:您的代码工作正常(包括打印Windows命令控制台,见图)。再深入一点看,我发现我正在取消引用和解码的字符串(示例代码中的
q
)是unicode,而我假设在您的示例中它是字符串(我使用的是2.7)。如果我把你的代码变成一个unicode字符串,它就像我的代码一样。我相信我现在已经有了它。我需要首先将字符串编码为
utf-8
,然后
unquote\u plus
将其重新解码为
utf-8
返回unicode。
import urllib

q = "Eptisa+Servicios+de+Ingenier%C3%ADa+S.L."
b = urllib.unquote_plus(q)
u = b.decode("utf-8")
print u
print u.encode(character_encoding_your_console_understands)