Javascript IDN感知工具,用于将人类可读的IRI编码/解码到有效URI或从有效URI解码

Javascript IDN感知工具,用于将人类可读的IRI编码/解码到有效URI或从有效URI解码,javascript,python,html,idn,iri,Javascript,Python,Html,Idn,Iri,假设用户输入某个资源的地址,我们需要将其转换为: <a href="valid URI here">human readable form</a> HTML4规范是指只允许在主机部分中使用ASCII字母数字字符和破折号,而其他部分中的所有非ASCII字符都应进行百分比编码的规范。这就是我想在href属性中添加的内容,以使链接在所有浏览器中正常工作。IDN应使用进行编码 HTML5草案还允许主机部分使用百分比编码的unicode字符,主机和其他部分使用大量的unico

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

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

HTML4规范是指只允许在主机部分中使用ASCII字母数字字符和破折号,而其他部分中的所有非ASCII字符都应进行百分比编码的规范。这就是我想在href属性中添加的内容,以使链接在所有浏览器中正常工作。IDN应使用进行编码

HTML5草案还允许主机部分使用百分比编码的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(没有适当的规范化,但我可以接受)编码/解码。整个任务需要更多的工作,并且存在一些缺陷(根据上下文,某些字符应始终编码或从不编码)。我想知道是否有现成的库来解决整个问题,因为它似乎很常见,而且现代浏览器已经进行了这样的转换(尝试在Google Chrome中键入
http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/
,它将被替换为
http://Саааааааа.Пф/
,但在http请求中使用
Host:xn--80aswg.xn--p1ai

Update2:Vinay Sajip指出,Werkzeug有iri_to_uri和uri_to_iri函数,可以正确处理大多数情况。到目前为止,我只发现了两种失败的情况:主机编码百分比(很容易修复)和无效utf-8序列(这有点棘手,但不应该是个问题)


我仍在寻找JavaScript库。编写并不困难,但我更愿意避免发明轮子。

如果我理解正确,那么您可以使用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在0.6版和更高版本中具有和功能(链接到文档的相关部分)


进一步更新:对不起,我没有注意到您正在寻找一个JavaScript实现以及Python实现。punycode的现有公共域JavaScript实现是。但是,我不能担保。当然,您可以使用内置JavaScript
encodeURI
/
decodeURI
API。

您的乐趣所在ctions仅适用于此示例。Werkzeug函数适用于大多数情况,其他情况下可以轻松修复,谢谢!您的编码行中有-'而不是-。为了避免这种混乱,您可以只编写#编码:utf-8Duplicate:感谢链接。问题不在于Punycode编码实现(很简单),但这是一个更大的问题。然后你可能应该澄清一下,因为我仍然不明白你的要求。我在回答中添加了一个Javascript实现的链接,该链接可能适合你的需要。这是公共领域,但需要单元测试,我会说。