解码包含unicode字符的URL

时间:2013-01-10 04:30:36

标签: unicode python-2.7 escaping cherrypy mako

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

<a href="#" onclick='getCompanyHTML("${fund.investments[inv_name].name | u}"); return false;'>${inv_name}</a>

这将url转义为表示公司的对象的名称字符串。然后,在URL中使用生成的转义字符串。 Mako文档声明使用urllib.quote_plus(string.encode('utf-8'))提供了url编码。

在服务器上,我将公司名称部分收到参数investment_name

def Investment(client, fund_name, investment_name, **kwargs):
    client          = urllib.unquote_plus(client)
    fund_name       = urllib.unquote_plus(fund_name)
    investment_name = urllib.unquote_plus(investment_name)

然后我使用investment_name作为键,返回到在模板中从中提取它的同一个字典。

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

例如,公司名称为“Eptisa ServiciosdeIngenieríaS.L.”的网址。被表示为“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 + Ingenier%C3%ADa + S.L”做些什么。把它变成“Eptisa ServiciosdeIngenieríaS.L。”?

1 个答案:

答案 0 :(得分:1)

以相反的顺序执行:首先取消引用然后.decode('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可能会产生UnicodeEncodeError。解决它:

print u.encode(character_encoding_your_console_understands)

设置PYTHONIOENCODING环境变量。

在Unix上,您可以尝试locale.getpreferredencoding()作为字符编码,在Windows上查看chcp的输出