IDN Aware Инструменты для кодирования / декодирования читаемого человека IRI к / от действительного URI [Закрыто

StackOverflow https://stackoverflow.com/questions/2833013

Вопрос

Предположим, что пользователь введите адрес некоторых ресурсов, и нам нужно перевести его на:

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

Спецификация HTML4 относится к RFC 3986. Что позволяет только буквенно-цифровыми символами ASCII и приборной детали в хост-части, и все символы без ASCII в других частях должны быть в процентах. Это то, что я хочу поставить в Href Accoutute, чтобы ссылаться правильно работать во всех браузерах. ИДН должен быть закодирован с Деначистый.

Черновик 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. Вся задача нуждается в гораздо большее время, и есть некоторые подводные камни (некоторые символы должны всегда закодироваться или никогда не закодироваться в зависимости от контекста). Интересно, будут ли готовы использовать библиотеки для все Проблема, поскольку, поскольку кажется, довольно распространены, и современные браузеры уже делают такие преобразования (попробуйте набрать http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/ в Google Chrome и его будет заменено http://сайт.рф/, но использовать Host: xn--80aswg.xn--p1ai в HTTP-запросе).

Update2.: Vinay Sajip указал, что Werkzeug имеет IRI_TO_URI и функции URI_TO_IRI, которые правильно обрабатывают большинство случаев. Я нашел только 2 случая, когда он не удается: хост-кодировщик в процентах (довольно легко исправить) и недействительные последовательности 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 имеет iri_to_uri а также uri_to_iri Функции в версиях 0.6, а затем (ссылки на соответствующей части документов).

Дальнейшее обновление: Извините, я не заметил, что вы ищете реализацию JavaScript, а также Python One. Существующая публичная достоятельная реализация JavaScript из PunyCode здесь. Отказ Я не могу поручиться за это, хотя. И, конечно, вы можете использовать встроенный JavaScript encodeURI/decodeURI Апис

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top