仅解码URL非ascii字符

时间:2012-12-13 09:57:48

标签: python python-2.7 urldecode

现在我在维基百科上工作。在许多文章中,我注意到一些网址(例如https://www.google.com/search?q=%26%E0%B8%89%E0%B8%B1%E0%B8%99)非常长。示例网址可以替换为“https://www.google.com/search?q=%26ฉัน”(ฉัน是泰语单词),它更短更清洁。但是,当我使用urllib.unquote函数解码URL时,它甚至会解码%26并得到“https://www.google.com/search?q=&ฉัน”作为结果。您可能已经注意到,此URL无用;它没有建立有效的链接。

因此,我想知道如何在有效的情况下获得解码链接。我认为仅解码非ascii字符将获得有效的URL。这是对的吗?以及如何做到这一点?

谢谢:)

1 个答案:

答案 0 :(得分:1)

最简单的方法是,您可以使用一些占位符替换%80(%00-%7F)下的所有URL编码序列,执行URL解码,并将原始URL编码序列替换回占位符。

另一种方法是寻找UTF-8序列。您的网址似乎以UTF-8编码,维基百科使用UTF-8。您可以看到Wikipedia entry for UTF-8有关如何编码UTF-8字符的信息。

因此,当在URL中编码时,每个有效的非ascii UTF-8字符都将遵循以下模式之一:

  • (%C0-%DF)(%80-%BF)
  • (%E0-%EF)(%80-%BF)(%80-%BF)
  • (%F0-%F7)(%80-%BF)(%80-%BF)(%80-%BF)
  • (%F8-%FB)(%80-%BF)(%80-%BF)(%80-%BF)(%80-%BF)
  • (%FC-%FD)(%80-%BF)(%80-%BF)(%80-%BF)(%80-%BF)(%80-%BF)

因此,您可以在URL中匹配这些模式,并单独取消引用每个字符。


但请记住,并非所有网址都以UTF-8编码。

在一些旧网站中,他们仍然使用其他字符集,例如Windows-874用于泰语。

在这种情况下,该特定网站的“ฉัน”编码为“%A9%D1%B9”而不是“%E0%B8%89%E0%B8%B1%E0%B8%99”。如果您使用urllib.unquote对其进行解码,则会出现一些乱码文本,例如“?ѹ”而不是“ฉัน”,这可能会破坏链接。

因此,您必须小心并检查URL解码是否破坏了链接。确保您要解码的URL是UTF-8。