用Python编码带有特殊字符的URL

11

我希望能够用特殊字符对URL进行编码。 在我的情况下,它们是:š、ä、õ、æ、ø(这不是有限列表)。

urllib2.quote(symbol)会给出非常奇怪且不正确的结果。 还有什么其他方式可以对这些符号进行编码呢?


预期的编码结果是什么? - falsetru
这不是一个有限列表。我可能想质疑这个说法,因为可能的Unicode字符列表是有限的。;-) 此外,@falsetru所说的也是正确的。我得到了urllib2.quote('ä') == '%C3%A4' - Kijewski
urllib2.quote("Grønlandsleiret, Oslo, Norway") 返回 %27Gr%B8nlandsleiret%2C%20Oslo%2C%20Norway%27,当我向谷歌地图发出请求(https://maps.googleapis.com/maps/api/geocode/json?address=%27Gr%B8nlandsleiret%2C%20Oslo%2C%20Norway%27)时,我收到了无效请求的响应。 - Bob
@Bob,urllib2.quote("Grønlandsleiret, Oslo, Norway") 对我来说返回的是 'Gr%C3%B8nlandsleiret%2C%20Oslo%2C%20Norway'。访问相应的URL会显示有效响应:https://maps.googleapis.com/maps/api/geocode/json?address=Gr%C3%B8nlandsleiret%2C%20Oslo%2C%20Norway。 - falsetru
我正在使用Python 2.7.8版本,这会有问题吗? - Bob
1个回答

14

urllib2.quote("Grønlandsleiret, Oslo, Norway")会得到%27Gr%B8nlandsleiret%2C%20Oslo%2C%20Norway%27

那就显式地使用UTF-8:

urllib2.quote(u"Grønlandsleiret, Oslo, Norway".encode('UTF-8'))

请始终在文件中声明编码方式。详见PEP 0263


非UTF-8字符串需要先解码再进行编码:

                           # You've got a str "s".
s = s.decode('latin-1')    # (or what the encoding might be …)
                           # Now "s" is a unicode object.
s = s.encode('utf-8')      # Encode as UTF-8 string.
                           # Now "s" is a str again.
s = urllib2.quote(s)       # URL encode.
                           # Now "s" is encoded the way you need it.

1
它有效了!encode('UTF-8') 就是我一直在寻找的。 - Bob
问题:如果我有一个地址作为变量,那么urllib2.quote('u' + address.encode('UTF-8'))会出现错误-> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 6: ordinal not in range(128)。我该怎么办? - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接