【问题标题】:decode URL only non-ascii character仅解码 URL 非 ascii 字符
【发布时间】:2021-07-28 19:26:40
【问题描述】:

现在我正在研究维基百科。在许多文章中,我注意到一些 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。这是正确的吗?以及如何做到这一点?

谢谢:)

【问题讨论】:

    标签: python python-2.7 urldecode


    【解决方案1】:

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

    另一种方法是查找 UTF-8 序列。您的 URL 似乎以 UTF-8 编码,而 Wikipedia 使用 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 格式。

    【讨论】:

    • 您能否提供更多关于如何实施您的建议的详细信息?例如,实际编码“用某个占位符替换所有低于 %80 (%00-%7F) 的 URL 编码序列,进行 URL 解码,并将原始 URL 编码序列替换回占位符”的干净方法是什么?我想到的设计是使用正则表达式来查找这些事件,为每个事件生成一个 UUID 并用这个 id 替换它们,将事件及其 UUID 保存在 dict 中,进行 url 解码,然后迭代 dict 和撤消替换。虽然这似乎相当低效和丑陋......
    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多