Was ist der richtige Weg zur URL-Codierung von Unicode-Zeichen?

Ich kenne das nicht standardmäßige% uxxxx Schema, aber das scheint keine kluge Wahl zu sein, da das Programm vom W3C abgelehnt wurde.

Einige interessante Beispiele:

Der Herzcharakter. Wenn ich das in meinen Browser eintippe:

http://www.google.com/search?q=♥ 

Dann kopiere und füge es ein, ich sehe diese URL

 http://www.google.com/search?q=%E2%99%A5 

was es so aussehen lässt, als würde Firefox (oder Safari) dies tun.

 urllib.quote_plus(x.encode("latin-1")) '%E2%99%A5' 

was macht Sinn, außer für Dinge, die nicht in Latin-1 codiert werden können, wie der Dreifach-Punkt-Charakter.

  

Wenn ich die URL eintippe

 http://www.google.com/search?q=… 

in meinen Browser kopieren und einfügen, dann bekomme ich

 http://www.google.com/search?q=%E2%80%A6 

zurück. Was scheint das Ergebnis zu sein

 urllib.quote_plus(x.encode("utf-8")) 

was sinnvoll ist, da … nicht mit Latin-1 codiert werden kann.

Aber dann ist mir nicht klar, wie der Browser weiß, ob er mit UTF-8 oder Latin-1 dekodieren soll.

Da dies zweideutig zu sein scheint:

 In [67]: u"…".encode('utf-8').decode('latin-1') Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6' 

funktioniert, also weiß ich nicht, wie der Browser rausfindet, ob er das mit UTF-8 oder Latin-1 dekodieren soll.

Was ist das Richtige mit den Sonderzeichen, mit denen ich umgehen muss?

    Ich würde immer in UTF-8 kodieren. Von der Wikipedia-Seite zur Prozentkodierung :

    Die generische URI-Syntax schreibt vor, dass neue URI-Schemata, die für die Darstellung von Zeichendaten in einem URI sorgen, tatsächlich Zeichen aus dem nicht reservierten Satz ohne Übersetzung darstellen und alle anderen Zeichen nach UTF-8 in Bytes umwandeln müssen Prozent kodieren diese Werte. Diese Anforderung wurde im Januar 2005 mit der Veröffentlichung von RFC 3986 eingeführt . URI-Schemata, die vor diesem Datum eingeführt wurden, sind nicht betroffen.

    Es scheint, als ob es in der Vergangenheit andere akzeptierte Wege gab, URL-Kodierung zu machen, Browser versuchen mehrere Methoden, einen URI zu dekodieren, aber wenn Sie derjenige sind, der die Kodierung durchführt, sollten Sie UTF-8 verwenden.

    Die allgemeine Regel scheint zu sein, dass Browser Formularantworten entsprechend dem Inhaltstyp der Seite kodieren, von der das Formular geliefert wurde. Dies ist eine Vermutung, dass, wenn der Server uns “text / xml; charset = iso-8859-1” sendet, sie Antworten im selben Format erwarten.

    Wenn Sie nur eine URL in die URL-Leiste eingeben, hat der Browser keine Basisseite, an der er arbeiten kann, und muss daher nur raten. In diesem Fall scheint es utf-8 die ganze Zeit zu tun (da beide Eingaben drei Oktett-Form-Werte erzeugt haben).

    Die traurige Wahrheit ist, dass AFAIK gibt es keinen Standard für, welche Zeichen setzen die Werte in einer Abfrage-Zeichenfolge, oder in der Tat alle Zeichen in der URL sollte als interpretiert werden. Zumindest im Fall von Werten in der Abfragezeichenfolge gibt es keinen Grund anzunehmen, dass sie notwendigerweise Zeichen entsprechen.

    Es ist ein bekanntes Problem, dass Sie Ihrem Server-Framework mitteilen müssen, welcher Zeichensatz erwartet wird, dass die Abfragezeichenfolge als — codiert wird. In Tomcat müssen Sie beispielsweise request.setEncoding () (oder eine ähnliche Methode) vor Ihnen aufrufen Rufen Sie eine der request.getParameter () -Methoden auf. Der Mangel an Dokumentation zu diesem Thema spiegelt wahrscheinlich das mangelnde Bewusstsein des Problems bei vielen Entwicklern wider. (Ich frage regelmäßig Java-Befragte, was der Unterschied zwischen einem Reader und einem InputStream ist, und bekomme regelmäßig leere Ausschnitte)

    IRI ( RFC 3987 ) ist der neueste Standard, der die URI / URL ( RFC 3986 und älter) Standards ersetzt. URI / URL unterstützt Unicode nicht nativ ( RFC 3986 fügt für zukünftige URI / URL-basierte Protokolle entsprechende Vorkehrungen hinzu, aktualisiert jedoch keine früheren RFCs). Das Schema “% uXXXX” ist eine nicht standardmäßige Erweiterung, die in einigen Situationen Unicode zulässt, wird jedoch nicht von allen Benutzern implementiert. IRI hingegen unterstützt vollständig Unicode und erfordert, dass Text als UTF-8 codiert wird, bevor er dann in Prozent codiert wird.

    IRIs ersetzen keine URIs, da nur URIs (effektiv, ASCII) in einigen Kontexten zulässig sind – einschließlich HTTP.

    Stattdessen geben Sie ein IRI an, und es wird in einen URI umgewandelt, wenn es auf dem Draht geht.

    Die erste Frage ist, was sind Ihre Bedürfnisse? UTF-8-Codierung ist ein ziemlich guter Kompromiss zwischen der Erstellung von Text mit einem preiswerten Editor und der Unterstützung für eine Vielzahl von Sprachen. In Bezug auf den Browser, der die Kodierung identifiziert, sollte die Antwort (vom Webserver) dem Browser die Kodierung mitteilen. Dennoch versuchen die meisten Browser zu raten, weil dies in vielen Fällen entweder fehlt oder falsch ist. Sie schätzen, indem sie eine bestimmte Menge des Ergebnisstroms lesen, um zu sehen, ob ein Zeichen vorhanden ist, das nicht in die Standardcodierung passt. Momentan verwenden alle Browser (? Ich habe das nicht überprüft, aber es ist ziemlich nah an wahr) utf-8 als Standard verwenden.

    Verwenden Sie utf-8, es sei denn, Sie haben einen zwingenden Grund, eines der vielen anderen Codierungsschemas zu verwenden.