IDN conscientes herramientas para codificar / decodificar legible IRI a / desde URI válido [cerrado]

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

Pregunta

Vamos a suponer que un usuario introduzca la dirección de algún recurso y tenemos que traducirlo a:

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

HTML4 memoria descriptiva se refiere a RFC 3986 que sólo permite ASCII caracteres alfanuméricos y guión en parte de host y todos los caracteres no ASCII en otras partes deben ser codificados por ciento. Eso es lo que yo quiero poner en el atributo href para hacer de enlace funciona correctamente en todos los navegadores. IDN debe ser codificado con Punycode .

HTML5 proyecto se refiere a RFC 3987 que también permite por ciento codificada caracteres Unicode en parte anfitrión y un gran subconjunto de Unicode en tanto anfitrión y otras partes sin que los codifican. El usuario puede introducir la dirección en cualquiera de estas formas. Para proporcionar formato legible por humanos de la misma que necesito para decodificar todos los caracteres imprimibles. Tenga en cuenta que algunas partes de la dirección podrían no corresponder a las secuencias de caracteres UTF-8 válidos, por lo general cuando el sitio de destino utiliza alguna otra codificación de caracteres.

Un ejemplo de lo que me gustaría conseguir:

<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>

¿Hay herramientas para resolver estas tareas? Estoy especialmente interesado en las bibliotecas de Python y JavaScript.

Actualizar : Sé que hay una manera de hacerlo por ciento y Punycode (sin normalización adecuada, pero puedo vivir con ella) de codificación / decodificación en Python y JavaScript. Toda la tarea requiere mucho más trabajo y hay algunos errores (algunos caracteres deben ser codificados siempre o nunca codificados dependiendo del contexto). Me pregunto si no están listos para usar las bibliotecas para el toda problema, ya que parece ser bastante común y los navegadores modernos ya hacer este tipo de conversiones (prueba http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/ escribir en Google Chrome y será reemplazado con http://сайт.рф/, pero el uso Host: xn--80aswg.xn--p1ai en la solicitud HTTP).

Update2 : Vinay Sajip señalado que Werkzeug tiene que maneja la mayoría de los casos correctamente iri_to_uri y uri_to_iri funciones. He encontrado sólo 2 casos en los que fracasa hasta ahora: por ciento codificados anfitrión (bastante fácil de solucionar) y no válidos UTF-8 secuencias (que es un poco difícil de hacer muy bien, pero no debería ser un problema)

Todavía estoy en busca de biblioteca en JavaScript. No es difícil escribir, pero yo preferiría evitar inventar la rueda.

¿Fue útil?

Solución

Si he entendido bien, a continuación, puede utilizar las baterías incluidas en 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'))

que imprime

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/

que se parece a lo que desea. No estoy seguro de lo que quiere decir casos especiales - tal vez usted podría dar algunos ejemplos de las trampas que estés consultando

?

Actualización: acabo de recordar, Werkzeug tiene iri_to_uri y href="http://werkzeug.pocoo.org/documentation/dev/utils.html#werkzeug.uri_to_iri" rel="nofollow noreferrer"> uri_to_iri funciones en versiones 0,6 y más tarde (los enlaces son a la parte pertinente de los documentos).

Además de actualización: Lo sentimos, no me había dado cuenta de que usted está buscando una implementación de JavaScript, así como una pitón. Un dominio público ejecución de Javascript punycode existente es aquí . No puedo dar fe de ello, sin embargo. Y, por supuesto, puede utilizar el built-in API encodeURI / decodeURI JavaScript.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top