IDN bewusst Werkzeuge Encoder / Decoder für Menschen lesbaren IRI zu / von gültigen URI [geschlossen]

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

Frage

übernehmen sie eine Benutzeradresse einer Ressource eingeben, und wir müssen übersetzen es an:

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

HTML4 Angabe bezieht sich auf RFC 3986 , die nur ASCII-alphanumerische Zeichen und Strich erlaubt in Hostteil und alle nicht-ASCII-Zeichen in anderen Teilen sollen Prozent-codiert sein. Das ist, was ich in href Attribut setzen möchten Link, um die Arbeit richtig in allen Browsern. IDN sollten mit Punycode codiert werden.

HTML5 Entwurf bezieht sich auf RFC 3987 die auch Prozent-kodierten Unicode-Zeichen können in Host-Teil und eine große Untergruppe von Unicode in sowohl Host und anderen Teilen, ohne sie zu codieren. Der Benutzer kann Adresse in einem dieser Formulare eingeben. Zur Bereitstellung von Menschen lesbare Form es muß ich alle druckbaren Zeichen entschlüsseln. Beachten Sie, dass einige Teile der Adresse möglicherweise nicht auf gültige UTF-8-Sequenzen entsprechen, in der Regel, wenn Zielstelle verwendet eine andere Zeichencodierung.

Ein Beispiel dafür, was Ich mag würde bekommen:

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

Gibt es irgendwelche Werkzeuge, um diese Aufgaben zu lösen? Ich bin vor allem in Bibliotheken für Python und JavaScript interessiert.

Aktualisieren : Ich weiß, dass es einen Weg gibt Prozent und Punycode zu tun (ohne richtige Normalisierung, aber ich kann damit leben) Codierung / Decodierung in Python und JavaScript. Die ganze Aufgabe braucht viel mehr Arbeit und es gibt einige Fallen (einige Zeichen immer verschlüsselt werden sollen oder nicht, je nach Kontext codiert). Ich frage mich, ob es bereit Bibliotheken zu verwenden, für das ganzes Problem, da es durchaus üblich und moderne Browser bereits tun solche Umwandlungen zu sein scheint (versuchen Typisierung http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/ in Google Chrome und es wird mit http://сайт.рф/ ersetzt werden, aber die Verwendung Host: xn--80aswg.xn--p1ai in HTTP-Anfrage).

Update2 : Vinay Sajip darauf hingewiesen, dass Werkzeug iri_to_uri und uri_to_iri Funktionen dass Griffe den meisten Fällen richtig hat. Ich habe nur zwei Fälle gefunden, wo es bisher nicht: Prozent-encoded Host (ganz einfach zu fix) und ungültige utf-8-Sequenzen (es ist ein bisschen schwierig, gut zu tun, aber sollte kein Problem sein)

Ich bin noch auf der Suche nach Bibliothek in JavaScript. Es ist nicht schwer zu schreiben, aber ich würde das Rad zu vermeiden, lieber zu erfinden.

War es hilfreich?

Lösung

Wenn ich Sie richtig verstehe, dann können Sie die Batterien in Python enthalten verwenden:

# -*- 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'))

welche Drucke

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/

, die aussieht wie das, was Sie wollen. Ich bin mir nicht sicher, was besonderen Fällen Sie bedeuten - vielleicht könnten Sie ein paar Beispiele für die Gefahren geben Sie sich beziehen

?

Update: Ich habe gerade daran erinnert, Werkzeug hat uri_to_iri Funktionen in den Versionen 0,6 und später (Links sind auf den betreffenden Teil der Dokumente).

Weitere Update: Sorry, ich hatte nicht bemerkt, dass Sie für eine JavaScript-Implementierung freuen sowie einer Python. Eine bestehende public domain Javascript Implementierung von Punycode ist hier . Ich kann es nicht bürgen, though. Und natürlich können Sie die Einbau-verwenden JavaScript encodeURI / decodeURI APIs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top