Unicode-Zeichen in URLs

135

Würden Sie 2010 URLs mit UTF-8-Zeichen in einem großen Webportal bereitstellen?

Unicode-Zeichen sind gemäß RFC für URLs verboten (siehe hier ). Sie müssten prozentual codiert sein, um standardkonform zu sein.

Mein Hauptpunkt ist jedoch, die nicht codierten Zeichen nur für gut aussehende URLs bereitzustellen, sodass die prozentuale Codierung nicht funktioniert.

Alle gängigen Browser scheinen diese URLs zu analysieren, egal was der RFC sagt. Mein allgemeiner Eindruck ist jedoch, dass es beim Verlassen der Domäne von Webbrowsern sehr wackelig wird:

  • URLs werden kopiert und in Textdateien, E-Mails und sogar Websites mit einer anderen Codierung eingefügt
  • HTTP-Client-Bibliotheken
  • Exotische Browser, RSS-Reader

Ist mein Eindruck richtig, dass hier Probleme zu erwarten sind, und daher ist es (noch) keine praktische Lösung, wenn Sie ein nicht technisches Publikum bedienen und es wichtig ist, dass alle Ihre Links ordnungsgemäß funktionieren, auch wenn sie zitiert und weitergegeben werden?

Gibt es eine magische Möglichkeit, gut aussehende URLs in HTML bereitzustellen?

http://www.example.com/düsseldorf?neighbourhood=Lörick

das kann mit intakten Sonderzeichen kopiert + eingefügt werden, funktioniert aber korrekt, wenn es in älteren Clients wiederverwendet wird?

Pekka
quelle
16
Firefox seinerseits zeigt die Unicode-Zeichen in seiner URL-Leiste an, sendet sie jedoch an den codierten Serverprozentsatz. Wenn ein Benutzer die URL aus der URL-Leiste kopiert, stellt Firefox außerdem sicher, dass die prozentual codierte URL in die Zwischenablage kopiert wird.
Siddhartha Reddy

Antworten:

126

Verwenden Sie die prozentuale Codierung. Moderne Browser kümmern sich um Probleme beim Anzeigen und Einfügen und machen sie für den Menschen lesbar. Z.B. http://ko.wikipedia.org/wiki/ 위키 백과: 대문

Bearbeiten: Wenn Sie eine solche URL in Firefox kopieren, enthält die Zwischenablage das prozentual codierte Formular (was normalerweise eine gute Sache ist). Wenn Sie jedoch nur einen Teil davon kopieren, bleibt es nicht codiert.

Tgr
quelle
Wow, eigentlich hast du recht! Wenn Sie eine% -codierte URL ausschneiden und einfügen, wird sie von Firefox in die richtige Anzeigeform umgewandelt.
Dean Harding
Wow, das war mir nicht bewusst. Wahrscheinlich ist dies die beste Lösung!
Pekka
33
@ Dean, das ist eine relativ neue Änderung - im Jahr 2005 sahen alle internationalen Wikipedias wie echte% 6D% 65% 73% 73 aus.
Roman Starkov
2
Sie können die nicht codierten UTF-8-URLs, nämlich IRIs , jetzt in HTML5- Dokumenten verwenden. Wenn Sie dies tun, werden es alle gängigen Browser verstehen und in ihrer Adressleiste korrekt anzeigen.
Oliver
Welche Bytes senden moderne Browser an Server in der Anforderungszeile GET /images/logo.png HTTP/1.1? Codieren sie die URL immer in Prozent?
Flimm
87

Was Tgr gesagt hat. Hintergrund:

http://www.example.com/düsseldorf?neighbourhood=Lörick

Das ist keine URI. Aber es ist ein IRI .

Sie können keine IRI in ein HTML4-Dokument aufnehmen. Die Art der Attribute wie hrefist als URI und nicht als IRI definiert. Einige Browser verarbeiten hier sowieso eine IRI, aber das ist keine gute Idee.

Um eine IRI in eine URI zu codieren, nehmen Sie den Pfad und die Abfrageteile, UTF-8-codieren Sie sie und codieren Sie dann die Nicht-ASCII-Bytes in Prozent:

http://www.example.com/d%C3%BCsseldorf?neighbourhood=L%C3%B6rick

Wenn der Hostname-Teil der IRI Nicht-ASCII-Zeichen enthält, z. http://例え.テスト/wurden sie stattdessen mit Punycode codiert .

Jetzt haben Sie eine URI. Es ist eine hässliche URI. Die meisten Browser verbergen dies jedoch für Sie: Kopieren Sie es und fügen Sie es in die Adressleiste ein oder folgen Sie ihm in einem Link, und es wird mit den ursprünglichen Unicode-Zeichen angezeigt. Wikipedia nutzt dies seit Jahren, z.

http://en.wikipedia.org/wiki/ɸ

Der einzige Browser, dessen Verhalten unvorhersehbar ist und nicht immer die hübsche IRI-Version anzeigt, ist ...

...und Sie wissen.

Bobince
quelle
31
Ich weiß. Eines Tages muss jemand einen großen Club nehmen und den Lynx-Entwicklern auf den Kopf schlagen. Vielen Dank für die hervorragenden Hintergrundinformationen.
Pekka
2
@bobince Und der einzige Bot (schneller Vorlauf bis 2013), der auch keine Nicht-IRI-URIs verarbeiten kann, ist ... ... nun, Sie wissen: Bingbot! Stelle dir das vor.
Tom Harrison
1
HTML5 unterstützt endlich IRIs. Weitere Informationen zu diesem Thema finden Sie in dieser Antwort auf eine verwandte Frage .
Oliver
5
Betreff: IE zeigt nicht immer hübsche IRIs an - sie schützen Benutzer vor homographenbasierten Phishing-Angriffen. Besuchen Sie w3.org/International/articles/idn-and-iri (insbesondere den Abschnitt 'Domainnamen- und Phishing') und blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
Codingoutloud
2
Domainnamen haben damit nichts zu tun. Alle Browser verbieten eine Vielzahl von Zeichen, um Phishing zu verhindern. Das Anzeigen von Nicht-ASCII-Zeichen im Pfad- oder Abfragezeichenfolgen-Teil führt nicht zu einer ähnlichen Verwundbarkeit. IE hat sich einfach nicht die Mühe gemacht, es zu implementieren. (Und Firefox ist der einzige, der es auch für den Fragmentteil implementiert hat.)
Tgr
16

Abhängig von Ihrem URL-Schema können Sie den UTF-8-codierten Teil "nicht wichtig" machen. Wenn Sie sich beispielsweise Stapelüberlauf-URLs ansehen, haben sie die folgende Form:

http://stackoverflow.com/questions/2742852/unicode-characters-in-urls

Dem Server ist es jedoch eigentlich egal, ob Sie das Teil nach der falschen Kennung erhalten, daher funktioniert dies auch:

http://stackoverflow.com/questions/2742852/ こ れ れ 、 、 こ を を 日本語 の テ キ ス ト で す

Wenn Sie also ein Layout wie dieses hätten, könnten Sie möglicherweise UTF-8 in dem Teil nach dem Bezeichner verwenden, und es wäre nicht wirklich wichtig, wenn es verstümmelt würde. Natürlich funktioniert das wahrscheinlich nur unter etwas speziellen Umständen ...

Dean Harding
quelle
Hmmm, sehr kluges Denken! Es könnte immer noch sein, dass einige Clients an den Zeichen ersticken, egal wo sie sich in der Zeichenfolge befinden, aber es würde alle Probleme mit normalem Verstümmeln beim Kopieren + Einfügen einer URL beseitigen, was meiner Meinung nach der wichtigste Teil ist. Hatte die URL von SO noch nicht so gesehen. Vielen Dank!
Pekka
Nun, das Wort "Fragen" bleibt immer noch unübersetzt, und es gibt Sachen nach Hash #, die der gesamten URL folgen, aber ein sehr schöner Trick !!
Evgeny
4
Ute 翻 翻 機 を 使 っ て そ の 日本語 の URL Gl 作 作 た ね。
Glutexo
6

Ich bin mir nicht sicher, ob es eine gute Idee ist, aber wie in anderen Kommentaren erwähnt und wie ich es interpretiere, sind viele Unicode-Zeichen in HTML5-URLs gültig .

ZB hrefdocs sagen http://www.w3.org/TR/html5/links.html#attr-hyperlink-href :

Das href-Attribut für a- und area-Elemente muss einen Wert haben, der eine gültige URL ist, die möglicherweise von Leerzeichen umgeben ist.

Dann verweist die Definition der "gültigen URL" auf http://url.spec.whatwg.org/ , wodurch URL-Codepunkte wie folgt definiert werden :

ASCII alphanumerisch, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/" , ":", ";", "=", "?", "@", "_", "~" und Codepunkte in den Bereichen U + 00A0 bis U + D7FF, U + E000 bis U + FDCF , U + FDF0 bis U + FFFD, U + 10000 bis U + 1FFFD, U + 20000 bis U + 2FFFD, U + 30000 bis U + 3FFFD, U + 40000 bis U + 4FFFD, U + 50000 bis U + 5FFFD, U. +60000 bis U + 6FFFD, U + 70000 bis U + 7FFFD, U + 80000 bis U + 8FFFD, U + 90000 bis U + 9FFFD, U + A0000 bis U + AFFFD, U + B0000 bis U + BFFFD, U + C0000 zu U + CFFFD, U + D0000 zu U + DFFFD, U + E1000 zu U + EFFFD, U + F0000 zu U + FFFFD, U + 100000 zu U + 10FFFD.

Der Begriff "URL-Codepunkte" wird dann in einigen Teilen des Parsing-Algorithmus verwendet, z. B. für den relativen Pfadstatus :

Wenn c kein URL-Codepunkt und nicht "%" ist, analysieren Sie den Fehler.

Auch der Validator http://validator.w3.org/ gilt für URLs wie "你好"und nicht für URLs mit Zeichen wie Leerzeichen"a b"

Verwandte: Welche Zeichen machen eine URL ungültig?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
Aber beide URLs ( "你好"und "a b") müssen prozentual codiert sein, wenn die HTTP-Anfrage gestellt wird, oder?
Utku
@Utku für "a b"Ich bin mir ziemlich sicher, ja, da Platz nicht in der Liste der erlaubten erlaubt ist. Denn "你好"es ist definitiv die bessere Idee, Prozent zu codieren, aber ich weiß nicht, ob es nur um "die Implementierungen sind nicht gut genug" oder um den "Standard sagt es" geht. Der HTML-Standard scheint diese Zeichen zuzulassen. Aber ich denke, dies wird durch den HTTP-Standard festgelegt, nicht durch HTML. Siehe auch: stackoverflow.com/questions/912811/…
Ciro Santilli 法轮功 冠状 病 六四 事件 8
Ja, ich habe an den HTTP-Standard gedacht, nicht an HTML.
Utku
5

Da alle diese Kommentare zutreffen, sollten Sie beachten, dass alle Browserhersteller (Microsoft, Mozilla, Apple usw.) , sofern ICANN arabische (persische) und chinesische Zeichen als Domain-Namen zugelassen hat, dies tun müssen unterstützt Unicode in URLs ohne Codierung, und diese sollten von Google usw. durchsuchbar sein.

Dieses Problem wird also so schnell wie möglich behoben.

Nasser Hadjloo
quelle
2
@Nasser: Richtig - wir haben jetzt auch Sonderzeichen in deutschen Domänen - aber diese werden mit Punycode in ASCII-Zeichen codiert . Obwohl sie sicher in gängigen Browsern funktionieren, wird es lange dauern, bis jede HTTP-Clientbibliothek und jede exotische Anwendung mit nicht codierten Unicode-Zeichen umgehen kann.
Pekka
@ Pekka, ich bin nicht sicher, aber wie ich gehört habe, müssen alle Browser Unicode URL im 4. Quartal 2010 unterstützen. (Ich bin nicht sicher)
Nasser Hadjloo
Das Problem wird durch die Tatsache kompliziert, dass nicht jeder Benutzeragent ein Webbrowser ist. Das größte Beispiel ist Google selbst: Es werden keine gängigen Webbrowser zum Crawlen verwendet. So würden viele Bibliotheken für API-Interaktion usw. usw. - URLs sind fast buchstäblich überall, nicht nur im WWW. Wahrscheinlich gerade auf Ihrem Dateisystem.
Cornelius
1

Verwenden Sie eine prozentual codierte Form . Einige (hauptsächlich alte) Computer unter Windows XP unterstützen beispielsweise keinen Unicode, sondern ISO-Codierungen. Aus diesem Grund wurden prozentual codierte URLs erfunden. Wenn Sie einem Benutzer eine auf Papier gedruckte URL geben, die Zeichen enthält, die nicht einfach eingegeben werden können, kann es für diesen Benutzer schwierig sein, sie einzugeben (oder sie einfach zu ignorieren). Prozentcodierte Form kann sogar in vielen der ältesten Maschinen verwendet werden, die jemals existierten (obwohl sie das Internet natürlich nicht unterstützen).

Es gibt jedoch einen Nachteil, da prozentual codierte Zeichen länger sind als die ursprünglichen, was möglicherweise zu sehr langen URLs führt. Aber versuchen Sie es einfach zu ignorieren oder verwenden Sie einen URL- Shortener (ich würde in diesem Fall goo.gl empfehlen , wodurch eine 13 Zeichen lange URL entsteht). Wenn Sie sich nicht für ein Google-Konto registrieren möchten, versuchen Sie es mit bit.ly (bit.ly erstellt etwas längere URLs mit einer Länge von 14 Zeichen).

EKons
quelle
Warum sollte ich veraltete Computer unterstützen wollen, die immer noch Windows XP verwenden?
Mateus Felipe
0

Für mich ist das der richtige Weg. Das hat einfach funktioniert:

    $linker = rawurldecode("$link");
    <a href="<?php echo $link;?>"   target="_blank"><?php echo $linker ;?></a>

Dies hat funktioniert und jetzt werden die Links richtig angezeigt:

http://newspaper.annahar.com/article/121638 -معرض - جوزف-حرب-في-غاليري-جانين-ربيز-لوحاته-الجدية-تبحث-وتكتشف-وتفرض-الاحترام

Link gefunden am:

http://www.galeriejaninerubeiz.com/newsite/news

Peter Manoukian
quelle
2
"Links werden richtig angezeigt" - außer dass der StackOverflow-Markdown-Parser URLs nicht wie beabsichtigt interpretiert!
MrWhite