Caratteri Unicode negli URL


135

Nel 2010, potresti pubblicare URL contenenti caratteri UTF-8 in un portale Web di grandi dimensioni?

I caratteri Unicode sono vietati come da RFC sugli URL (vedi qui ). Dovrebbero essere codificati in percentuale per essere conformi agli standard.

Il mio punto principale, tuttavia, è servire i caratteri non codificati al solo scopo di avere URL di bell'aspetto, quindi la codifica percentuale è fuori.

Tutti i principali browser sembrano analizzare bene quegli URL, indipendentemente da ciò che dice la RFC. La mia impressione generale, tuttavia, è che diventa molto traballante quando si lascia il dominio dei browser Web:

  • Gli URL vengono copiati + incollati in file di testo, e-mail e persino siti Web con una codifica diversa
  • Librerie client HTTP
  • Browser esotici, lettori RSS

La mia impressione è corretta che ci si aspetta un problema qui, e quindi non è (ancora) una soluzione pratica se stai servendo un pubblico non tecnico ed è importante che tutti i tuoi collegamenti funzionino correttamente anche se citati e trasmessi?

Esiste un modo magico di pubblicare URL di bell'aspetto in HTML

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

che può essere copiato + incollato con i caratteri speciali intatti, ma funziona correttamente quando riutilizzato nei client più vecchi?


16
Da parte sua, Firefox mostra i caratteri Unicode nella sua barra degli URL ma li invia alla percentuale del server codificata. Inoltre, quando un utente copia l'URL dalla barra degli URL, Firefox assicura che l'URL con codifica percentuale venga copiato negli Appunti.
Siddhartha Reddy,

Risposte:


126

Usa la codifica percentuale. I browser moderni si occuperanno dei problemi di visualizzazione e incolla e li renderanno leggibili dall'uomo. Per esempio. http://ko.wikipedia.org/wiki/ 위키 백과: 대문

Modifica: quando copi un tale URL in Firefox, gli Appunti manterranno il modulo con codifica percentuale (che di solito è una buona cosa), ma se ne copi solo una parte, rimarrà non codificato.


Wow, in realtà hai ragione! Se tagli un URL con codifica%, Firefox lo trasformerà nella cosa corretta per la visualizzazione.
Dean Harding,

Wow, non ne ero a conoscenza. È probabile che questa sia la soluzione migliore!
Pekka,

33
@Dean è un cambiamento abbastanza recente - nel 2005 tutte le wikipedias internazionali sembravano un vero% 6D% 65% 73% 73.
Roman Starkov,

2
Ormai puoi utilizzare gli URL UTF-8 non codificati, vale a dire IRI , nei documenti HTML5 . Se lo fai, tutti i principali browser lo capiranno e lo visualizzeranno correttamente nella loro barra degli indirizzi.
Oliver,

A quali byte i browser moderni inviano ai server nella riga di richiesta GET /images/logo.png HTTP/1.1? Codificano sempre in percentuale l'URL?
Flimm,

87

Quello che ha detto Tgr. Sfondo:

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

Questo non è un URI. Ma è un IRI .

Non puoi includere un IRI in un documento HTML4; il tipo di attributi come hrefè definito come URI e non IRI. Alcuni browser gestiranno comunque un IRI qui, ma non è davvero una buona idea.

Per codificare un IRI in un URI, prendere il percorso e interrogare le parti, UTF-8 codificarle e codificare in percentuale i byte non ASCII:

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

Se nella parte del nome host dell'IRI sono presenti caratteri non ASCII, ad es. http://例え.テスト/, sono stati invece codificati utilizzando Punycode .

Ora hai un URI. È un brutto URI. Ma la maggior parte dei browser lo nasconderà per te: copialo e incollalo nella barra degli indirizzi o seguilo in un link e lo vedrai visualizzato con i caratteri Unicode originali. Wikipedia lo utilizza da anni, ad es .:

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

L'unico browser il cui comportamento è imprevedibile e non mostra sempre la bella versione IRI è ...

...Beh lo sai.


31
Lo so. Un giorno, qualcuno deve prendere un grande club e colpire gli sviluppatori Lynx in testa. Grazie per le eccellenti informazioni di base.
Pekka,

2
@bobince E l'unico bot (avanzamento rapido al 2013) che non può gestire URI non IRI è ... ... beh, sai: bingbot! Vai a capire.
Tom Harrison,

1
HTML5 finalmente supporta gli IRI. Maggiori informazioni sull'argomento sono disponibili in questa risposta a una domanda correlata .
Oliver,

5
Ri: IE non mostra sempre graziosi IRI, ma protegge gli utenti da attacchi di phishing basati su omografi. Dai un'occhiata a w3.org/International/articles/idn-and-iri (in particolare la sezione "Nomi di dominio e phishing") e blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
codingoutloud

2
I nomi di dominio non hanno nulla a che fare con questo. Tutti i browser non consentono una vasta gamma di caratteri per impedire il phishing. La visualizzazione di caratteri non ASCII nel percorso o nella parte della stringa di query non crea una vilnerabilità simile. IE semplicemente non si è preoccupato di implementarlo. (E Firefox è l'unico che lo ha implementato anche per la parte del frammento.)
Tgr

16

A seconda del tuo schema URL, puoi rendere la parte codificata UTF-8 "non importante". Ad esempio, se si guardano gli URL di overflow dello stack, hanno il seguente formato:

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

Tuttavia, al server in realtà non importa se si ottiene la parte dopo l'identificatore errato, quindi funziona anche:

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

Quindi, se avessi un layout come questo, potresti potenzialmente usare UTF-8 nella parte dopo l'identificatore e non importerebbe davvero se fosse confuso. Naturalmente questo probabilmente funziona solo in circostanze un po 'specializzate ...


Hmmm, pensiero molto intelligente! Si potrebbe ancora essere che alcuni clienti soffocare sui personaggi, non importa dove si trovano nella stringa, ma sarebbe di eliminare tutti i problemi con garbling ordinaria quando copia + incolla un URL, che credo sia la parte più importante. Non avevo ancora guardato l'URL di SO in quel modo. Grazie!
Pekka,

bene, questo lascia ancora le parole "domande" non tradotte, inoltre ci sono cose dopo l'hash #, che segue l'intero url, un trucco molto carino però !!
Evgeny,

4
の 翻 訳 機 を 使 っ て そ の 日本語 の URL を 作 っ た ね。
Glutexo

6

Non sono sicuro che sia una buona idea, ma come menzionato in altri commenti e mentre lo interpreto, molti caratteri Unicode sono validi negli URL HTML5 .

Ad esempio, i hrefdocumenti dicono http://www.w3.org/TR/html5/links.html#attr-hyperlink-href :

L'attributo href sugli elementi a e area deve avere un valore che sia un URL valido potenzialmente circondato da spazi.

Quindi la definizione di "URL valido" punta a http://url.spec.whatwg.org/ , che definisce i punti del codice URL come:

ASCII alfanumerico, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/" , ":", ";", "=", "?", "@", "_", "~" e punti di codice negli intervalli da U + 00A0 a U + D7FF, U + E000 a U + FDCF , U + FDF0 a U + FFFD, U + 10000 a U + 1FFFD, U + 20000 a U + 2FFFD, U + 30000 a U + 3FFFD, U + 40000 a U + 4FFFD, U + 50000 a U + 5FFFD, U Da +60000 a U + 6FFFD, U da + 70000 a U + 7FFFD, U da + 80000 a U + 8FFFD, U + 90000 a U + 9FFFD, U + A0000 a U + AFFFD, U + B0000 a U + BFFFD, U + C0000 a U + CFFFD, U + D0000 a U + DFFFD, U + E1000 a U + EFFFD, U + F0000 a U + FFFFD, U + 100000 a U + 10FFFD.

Il termine "punti di codice URL" viene quindi utilizzato in alcune parti dell'algoritmo di analisi, ad esempio per lo stato del percorso relativo :

Se c non è un punto di codice URL e non "%", analizzare l'errore.

Anche il validatore http://validator.w3.org/ passa per URL simili "你好"e non passa per URL con caratteri come spazi"a b"

Correlati: quali caratteri rendono un URL non valido?


Ma entrambi gli URL ( "你好"e "a b") devono essere codificati in percentuale quando si effettua la richiesta HTTP, giusto?
Utku,

@Utku per "a b"Sono abbastanza sicuro sì poiché lo spazio non è nella lista consentita sopra. Perché "你好", è sicuramente l'idea migliore per codificare in percentuale, ma non so se si tratti solo di "le implementazioni non sono abbastanza buone" o lo "standard dice così". Lo standard HTML sembra consentire quei caratteri. Ma penso che questo sia specificato dallo standard HTTP, non da HTML. Vedi anche: stackoverflow.com/questions/912811/...
Ciro Santilli郝海东冠状病六四事件法轮功

Sì, stavo pensando allo standard HTTP, non all'HTML.
Utku,

5

Poiché tutti questi commenti sono veri, dovresti notare che per quanto riguarda i caratteri arabi (persiani) e cinesi approvati dall'ICANN per essere registrati come nome di dominio, tutte le società che producono browser (Microsoft, Mozilla, Apple, ecc.) Devono supporta Unicode negli URL senza alcuna codifica e questi dovrebbero essere ricercabili da Google, ecc.

Quindi questo problema risolverà al più presto.


2
@Nasser: Vero - ora abbiamo anche caratteri speciali nei domini tedeschi - ma questi sono codificati in caratteri ASCII usando Punycode . Sebbene funzionino sicuramente nei principali browser, ci vorrà molto tempo prima che ogni libreria client HTTP e ogni applicazione esotica siano in grado di gestire caratteri Unicode non codificati.
Pekka,

@Pekka, non sono sicuro ma, come ho sentito, tutti i browser devono supportare l'URL Unicode al 4 ° trimestre del 2010. (Non sono sicuro)
Nasser Hadjloo,

Il problema è complicato dal fatto che non tutti gli user agent sono un browser web. L'esempio più grande è lo stesso google: non utilizza browser Web comuni per eseguire la scansione. Così sarebbero molte librerie per l'interazione API ecc. Ecc. - Gli URL sono quasi letteralmente ovunque, non solo nel WWW. Probabilmente anche sul tuo file system in questo momento.
Cornelius,

1

Usa un modulo con codifica percentuale . Alcuni (principalmente vecchi) computer che eseguono Windows XP, ad esempio, non supportano Unicode, ma piuttosto codifiche ISO. Questo è il motivo per cui sono stati inventati gli URL con codifica percentuale. Inoltre, se si fornisce un URL stampato su carta a un utente, contenente caratteri che non possono essere facilmente digitati, è possibile che l'utente abbia difficoltà a digitarlo (o semplicemente ignorarlo). La forma con codifica percentuale può anche essere utilizzata in molte delle macchine più antiche che siano mai esistite (anche se ovviamente non supportano Internet).

C'è però un aspetto negativo, poiché i caratteri con codifica in percentuale sono più lunghi di quelli originali, con la conseguenza di avere URL molto lunghi. Ma prova a ignorarlo o usa un accorciatore di URL ( in questo caso consiglierei goo.gl , che rende un URL lungo 13 caratteri). Inoltre, se non vuoi registrarti per un account Google, prova bit.ly (bit.ly crea URL leggermente più lunghi, con una lunghezza di 14 caratteri).


Perché dovrei voler supportare i computer obsoleti che utilizzano ancora Windows XP?
Mateus Felipe,

0

Per me questo è il modo corretto, ha funzionato:

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

Questo ha funzionato e ora i collegamenti vengono visualizzati correttamente:

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

Link trovato su:

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


2
"i collegamenti sono visualizzati correttamente" - tranne per il fatto che il parser di markdown StackOverflow non interpreta gli URL come previsto!
MrWhite,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.