代码之家  ›  专栏  ›  技术社区  ›  Denis Otkidach

识别IDN的工具,用于将人类可读IRI编码/解码到/从有效的URI[关闭]

  •  3
  • Denis Otkidach  · 技术社区  · 14 年前

    假设用户输入某个资源的地址,我们需要将其转换为:

    <a href="valid URI here">human readable form</a>
    

    HTML4规范参考 RFC 3986 它只允许在主机部分使用ASCII字母数字字符和破折号,而其他部分的所有非ASCII字符都应该进行百分比编码。这就是我想要放入的href属性,以使链接在所有浏览器中都正常工作。IDN应该用 Punycode .

    HTML5草案指 RFC 3987 它还允许主机部分中的百分比编码的Unicode字符,以及主机和其他部分中的大部分Unicode子集,而不编码它们。用户可以在这些表单中输入地址。为了提供人类可读的形式,我需要解码所有可打印的字符。请注意,地址的某些部分可能与有效的UTF-8序列不对应,通常是在目标站点使用其他字符编码时。

    我想得到的一个例子:

    <a href="http://xn--80aswg.xn--p1ai/%D0%BF%D1%83%D1%82%D1%8C?%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81">
    http://сайт.рф/путь?запрос</a>
    

    有什么工具可以解决这些任务吗?我对python和javascript库特别感兴趣。

    更新 :我知道有一种方法可以用python和javascript进行百分比和punycode(没有适当的规范化,但我可以接受)编码/解码。整个任务需要更多的工作,并且有一些陷阱(一些字符应该总是被编码,或者从不根据上下文进行编码)。我想知道是否有现成的图书馆 整体 问题是,由于这似乎很常见,而且现代浏览器已经进行了这种转换(尝试键入 http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/ 在Google Chrome中,它将被替换为 http://сайт.рф/ 但使用 Host: xn--80aswg.xn--p1ai 在HTTP请求中)。

    更新2 :Vinay Sajip指出,Werkzeug具有IRI-to-Uri和URI-to-IRI函数,可以正确处理大多数情况。到目前为止,我只发现了2个失败的案例:百分比编码主机(相当容易修复)和无效的UTF-8序列(做得好有点困难,但不应该是问题)。

    我还在找用javascript编写的库。写起来并不难,但我宁愿避免发明轮子。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Community Egal    7 年前

    如果我理解正确,那么您可以使用python中包含的电池:

    # -*- coding: utf-8 -*-
    
    import urllib
    import urlparse
    
    URL1 = u'http://сайт.рф/путь?запрос'
    URL2 = 'http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/'
    
    def to_idn(url):
        parts = list(urlparse.urlparse(url))
        parts[1] = parts[1].encode('idna')
        parts[2:] = [urllib.quote(s.encode('utf-8')) for s in parts[2:]]
        return urlparse.urlunparse(parts)
    
    def from_idn(url):
        return urllib.unquote(url)
    
    print to_idn(URL1)
    print from_idn(URL2)
    print to_idn(from_idn(URL2).decode('utf-8'))
    

    哪些版画

    http://xn--80aswg.xn--p1ai/%D0%BF%D1%83%D1%82%D1%8C?%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81
    http://сайт.рф/
    http://xn--80aswg.xn--p1ai/
    

    看起来像你想要的。我不知道你的意思是什么特殊情况-也许你可以举一些例子说明你所指的陷阱?

    更新: 我只记得,Werkzeug iri_to_uri uri_to_iri 0.6及更高版本中的功能(链接到文档的相关部分)。

    进一步更新: 抱歉,我没有注意到您正在寻找一个JavaScript实现和一个Python实现。Punycode的现有公共域javascript实现是 here . 不过,我不能担保。当然,您可以使用内置的javascript encodeURI / decodeURI API。

    推荐文章