解码 URL 中的非 ASCII 字符

4

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

因此,我想知道如何在链接仍然有效时获取解码后的链接。我认为只解码非ASCII字符会得到有效的URL。这正确吗?如何做到这一点?

谢谢 :)

1个回答

1

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

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


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

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

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

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


你能详细介绍一下如何实现你的建议吗?比如,要如何编写“替换所有低于%80 (%00-%7F) 的 URL 编码序列为某个占位符,执行 URL 解码,然后将原始的 URL 编码序列替换回该占位符”的代码呢?我想到的设计是使用正则表达式查找这些出现的情况,为每个生成一个 UUID,并用此 ID 替换它们,保存出现和其 UUID 的字典,在进行 URL 解码后,迭代该字典并撤消替换。但这似乎效率不高,也不够优雅…… - HappyFace

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