我在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。”?
答案 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
的输出