2

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

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

这会将 url 转义应用于代表公司的对象的名称字符串。然后在 url 中使用生成的转义字符串。Mako 文档指出 url 编码是使用urllib.quote_plus(string.encode('utf-8')).

在服务器上,我将公司名称部分接收到参数中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 Servicios de Ingeniería SL”的 url 呈现为“Eptisa+Servicios+de+Ingenier%C3%ADa+SL” 当该值返回服务器时,我正在反转 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+SL”做些什么才能将其变回“Eptisa Servicios de Ingeniería SL”吗?

4

1 回答 1

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

于 2013-01-10T05:04:39.790 回答