python - 仅解码 URL 非 ascii 字符

标签 python python-2.7 urldecode

现在我在维基百科上工作。在很多文章中,我注意到一些 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。这是对的吗?以及如何做到这一点?

谢谢:)

最佳答案

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

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


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

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

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

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

关于python - 仅解码 URL 非 ascii 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857253/

相关文章:

java - 在 ANT 中解码 URL

python - 如何在 pipenv 中设置环境变量?

python - 如何将一列数据框或单行数据框作为数据框或系列返回?

python - 使用 pip 安装 pyyaml/将 PyYaml 添加为 pip 依赖项

python - CNN 模型上的文本分类

python - 是否可以捕获多种类型的异常,然后打印发生的确切类型?

Python: 'for ... in' 语句评估行为

python 3 : get 2nd to last index of occurrence in string

sql-server - Url Decode T-SQL 函数未翻译超出 ascii 范围的字符

php - 如何解码 php 中的 url,其中 url 使用 encodeURIComponent() 编码