3

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

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

谢谢 :)

4

1 回答 1

1

最简单的方法是,您可以将 %80 (%00-%7F) 以下的所有 URL 编码序列替换为某个占位符,进行 URL 解码,然后将原始 URL 编码序列替换回占位符。

另一种方法是查找 UTF-8 序列。您的 URL 似乎以 UTF-8 编码,而 Wikipedia 使用 UTF-8。您可以查看 UTF-8 的Wikipedia 条目,了解 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 中匹配这些模式,并分别取消对每个字符的引用。


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

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

在这种情况下,该特定网站的“ฉัน”编码为“%A9%D1%B9”,而不是“%E0%B8%89%E0%B8%B1%E0%B8%99”。如果你使用它解码,urllib.unquote你会得到一些乱码,比如“?ѹ”而不是“ฉัน”,这可能会破坏链接。

所以你必须小心并检查 URL 解码是否破坏了链接。确保您正在解码的 URL 是 UTF-8 格式。

于 2012-12-13T14:46:55.413 回答