Python URL解码?

5

在JavaScript中,我执行以下操作:

encodeURIComponent(comments)

在Python中,我会执行以下操作:

urllib2.unquote(comments)

出现以下情况时:

encodedURIComponents('ø')

我收到了%C3%B8,但是当我解码时...
urllib2.unquote('%C3%B8')

我得到的是ø而不是原始字符ø

这是怎么回事?

我所使用的平台客户端使用jQuery,服务器端使用Python/Django。


你看到这个错误是因为一边使用UTF-8编码,而另一边使用Latin-1编码。这就是为什么你不应该只使用默认编码并且盲目猜测;如果你有任何非ASCII字符,请在内部将它们保留在unicode字符串中,并在每个边界处适当地进行编码和解码字符串。(Python 3通过在出错时提供错误信息而不是乱码使此过程更加容易。) - abarnert
客户端的表单输入,我假设是UTF-8编码,而Python/Django使用Unicode编码?我正在使用Python 2.x版本。 - user1886965
Web表单有一种方式可以在每个方向(在HTTP头或响应正文中)指定字符集,并默认为Latin-1。Python 2具有在strunicode之间编码和解码的方法,如果只使用str,则处理其含义未指定的字节。(请参见sys.getdefaultencoding()返回的内容)。因此,获取表单所使用的字符集,并将字符串解码为Unicode以进行操作; 在发送回来时,编码为UTF-8并设置字符集(或者更好的是,让Django处理它,以防浏览器由于某种原因发送了“Accept-Charset”)。 - abarnert
1个回答

7

试着解码它:

urllib2.unquote('%C3%B8').decode('utf-8')   # --> 'ø'

1
请注意:它实际上是 urllib.unquote() - jfs
@abarnert: 那我该如何准备它以便在网页上查看? - user1886965
@user1886965:我不确定你的意思是什么。我相信Django可以让你在任何地方传递unicode字符串,并且会进行必要的转换以便与浏览器/客户端、数据库和日志文件等进行通信,因此你不需要做任何事情。我不确定为什么你需要在代码中使用urllib.unquote('%C3%B8')这一行,所以如果有问题,而VisioN的答案无法解决它,也许可以解释一下你的实际用例? - abarnert
我忘了提到,当我说压缩时,我的意思是创建一个 JSON 并将其放入隐藏字段中。 - user1886965
@user1886965:你正在回复的答案确实是VisioN的答案。无论如何,听起来你在这里有太多层编码——一个URL编码的字段实际上是一个包含URL编码字段的JSON编码对象?如果在这样复杂的情况下两边之间存在不匹配,任何人都很难猜出不匹配在哪里,除非你向我们展示实际代码。显然问题在于,在某个地方,至少在你的示例代码中,你试图将UTF-8解释为Latin-1;至于在你的真实代码中发生了什么,谁知道呢? - abarnert
显示剩余5条评论

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