让我们假设一个用户进入地址的一些资源,我们需要把它翻译为:

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

HTML4规范是指 RFC3986 这只允许ASCII码的字母数字符和冲于主机的一部分,所有非ASCII character在其他部分应百分比编码。这就是我想要放在href属性使链接的工作正在所有的浏览器。IDN应编码 Punycode.

HTML5草案指的是 RFC3987 它还允许百分比编码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。

更新:我知道有一个方式做%和Punycode(没有适当的正规化,但我可以生活)编/解码Python和JavaScript。整个任务需要更多的工作,也有一些缺陷(一些字应当总是被编码或从来没有编码的根据上下文)。我不知道,如果有准备使用的图书馆 整个 问题是,由于这似乎是相当普遍的和现代的浏览器已经做这样的转换(尝试打字 http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/ 在谷歌的铬和其将被替换 http://сайт.рф/, 但使用 Host: xn--80aswg.xn--p1ai 在HTTP request)。

Update2:维奈Sajip指出,有iri_to_uri和uri_to_iri功能处理大多数情况下正确。我已经发现,只有2起案件失败迄今为止:百分比编码主(相当容易修复)以及无效的utf-8顺序(这是一个棘手的做得很漂亮,但是不应该是一个问题)。

我还在寻找图书馆在JavaScript。这不是硬要编写的,但是我宁愿避免发明车轮。

有帮助吗?

解决方案

如果我理解正确,那么可使用的电池包括在蟒蛇:

# -*- 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/

它看起来像你想要什么。我不确定什么样的特殊情况下,你的意思-也许你可以给出一些例子的陷阱,你指的是?

更新: 我只记得,已 iri_to_uriuri_to_iri 功能的版本中的0.6和后(链接到有关部分的文档).

进一步更新: 对不起,我没注意到你正在寻找一个JavaScript执行情况以及蟒蛇之一。现有的公共领域Javascript执行punycode是 在这里,.我不能保证它,虽然。当然,你可以使用内JavaScript encodeURI/decodeURI Api。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top