Caracteres Unicode en URL


135

En 2010, ¿publicaría URL que contengan caracteres UTF-8 en un gran portal web?

Los caracteres Unicode están prohibidos según el RFC en las URL (ver aquí ). Tendrían que estar codificados por ciento para cumplir con los estándares.

Sin embargo, mi punto principal es servir los caracteres no codificados con el único propósito de tener URL de aspecto agradable, por lo que la codificación porcentual está desactivada.

Todos los principales navegadores parecen estar analizando esas URL bien, no importa lo que diga el RFC. Sin embargo, mi impresión general es que se vuelve muy inestable al abandonar el dominio de los navegadores web:

  • Las URL se copian y se pegan en archivos de texto, correos electrónicos e incluso sitios web con una codificación diferente
  • Bibliotecas de cliente HTTP
  • Navegadores exóticos, lectores RSS

¿Es correcto mi impresión de que se esperan problemas aquí y, por lo tanto, no es una solución práctica (todavía) si está sirviendo a una audiencia no técnica y es importante que todos sus enlaces funcionen correctamente incluso si se citan y se transmiten?

¿Hay alguna forma mágica de servir URL de aspecto agradable en HTML

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

que se puede copiar + pegar con los caracteres especiales intactos, pero que funciona correctamente cuando se reutiliza en clientes antiguos?


16
Por su parte, Firefox muestra los caracteres Unicode en su barra de URL pero los envía al porcentaje de servidor codificado. Además, cuando un usuario copia la URL de la barra de URL, Firefox asegura que el porcentaje de URL codificada se copia en el portapapeles.
Siddhartha Reddy

Respuestas:


126

Use el porcentaje de codificación. Los navegadores modernos se ocuparán de los problemas de visualización y pegado y lo harán legible para los humanos. P.ej. http://ko.wikipedia.org/wiki/ 위키 백과: 대문

Editar: cuando copie dicha URL en Firefox, el portapapeles contendrá la forma codificada en porcentaje (que generalmente es algo bueno), pero si copia solo una parte de ella, permanecerá sin codificar.


Wow, en realidad tienes razón! Si corta y pega una URL codificada en%, Firefox la convertirá en lo correcto para mostrar.
Dean Harding

Wow, no estaba al tanto de esto. Lo más probable es que esta sea la mejor solución.
Pekka

33
@Dean es un cambio bastante reciente: en 2005, todas las wikipedias internacionales parecían un% 6D% 65% 73% 73 real.
Roman Starkov

2
Ahora puede utilizar las URL UTF-8 no codificadas, es decir , IRI , en documentos HTML5 . Si hace eso, todos los principales navegadores lo entenderán y lo mostrarán correctamente en su barra de direcciones.
Oliver

¿A qué bytes envían los navegadores modernos a los servidores en la línea de solicitud GET /images/logo.png HTTP/1.1? ¿Siempre codifican en porcentaje la URL?
Flimm

87

Lo que dijo Tgr. Antecedentes:

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

Eso no es un URI. Pero es un IRI .

No puede incluir un IRI en un documento HTML4; el tipo de atributos como hrefse define como URI y no IRI. Algunos navegadores manejarán un IRI aquí de todos modos, pero no es realmente una buena idea.

Para codificar un IRI en un URI, tome la ruta y las partes de la consulta, codifíquelas con UTF-8 y luego codifique en porcentaje los bytes que no son ASCII:

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

Si hay caracteres no ASCII en la parte del nombre de host del IRI, por ejemplo. http://例え.テスト/, se han codificado utilizando Punycode en su lugar.

Ahora tienes un URI. Es un URI feo. Pero la mayoría de los navegadores lo ocultarán para usted: cópielo y péguelo en la barra de direcciones o sígalo en un enlace y verá que se muestra con los caracteres Unicode originales. Wikipedia ha estado usando esto durante años, por ejemplo:

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

El único navegador cuyo comportamiento es impredecible y no siempre muestra la bonita versión IRI es ...

...Bueno, ya sabes.


31
Lo sé. Un día, alguien tiene que tomar un gran club y golpear a esos desarrolladores de Lynx en la cabeza. Gracias por la excelente información de fondo.
Pekka

2
@bobince Y el único bot (avance rápido hasta 2013) que tampoco puede manejar URI no IRI es ... ... bueno, ya sabes: ¡bingbot! Imagínate.
Tom Harrison

1
HTML5 finalmente admite IRI. Se puede encontrar más información sobre el tema en esta respuesta a una pregunta relacionada .
Oliver

55
Re: IE no siempre muestra IRI bonitos: están protegiendo a los usuarios de ataques de phishing basados ​​en homógrafos. Visite w3.org/International/articles/idn-and-iri (específicamente la sección 'Nombres de dominio y phishing') y blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
codingoutloud

2
Los nombres de dominio no tienen nada que ver con esto. Todos los navegadores no permiten una amplia gama de caracteres para evitar el phishing. Mostrar caracteres no ASCII en la ruta o en la parte de la cadena de consulta no crea una vulnerabilidad similar. IE simplemente no se molestó en implementarlo. (Y Firefox es el único que también lo implementó para la parte del fragmento).
Tgr

16

Dependiendo de su esquema de URL, puede hacer que la parte codificada UTF-8 "no sea importante". Por ejemplo, si observa las URL de desbordamiento de pila, tienen la siguiente forma:

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

Sin embargo, al servidor en realidad no le importa si obtiene la parte después del identificador incorrecto, por lo que esto también funciona:

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

Entonces, si tuviera un diseño como este, entonces podría usar UTF-8 en la parte posterior al identificador y realmente no importaría si se distorsiona. Por supuesto, esto probablemente solo funcione en circunstancias algo especializadas ...


¡Hmmm, muy inteligente! Todavía podría ser que algunos clientes ahogan en los personajes, sin importar dónde se encuentren en la cadena, pero sería eliminar todos los problemas con garbling ordinaria cuando copiar + pegar una URL, que creo que es la parte más importante. Todavía no había mirado la URL de SO de esa manera. ¡Gracias!
Pekka

bueno, esto todavía deja las "preguntas" de la palabra sin traducir, además de que hay cosas después del hash #, que sigue a la url completa, aunque es un buen truco.
Evgeny

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

6

No estoy seguro de si es una buena idea, pero como se menciona en otros comentarios y como lo interpreto, muchos caracteres Unicode son válidos en URL HTML5 .

Por ejemplo, los hrefdocumentos dicen http://www.w3.org/TR/html5/links.html#attr-hyperlink-href :

El atributo href en un elemento de área debe tener un valor que sea una URL válida potencialmente rodeada de espacios.

Luego, la definición de "URL válida" apunta a http://url.spec.whatwg.org/ , que define los puntos de código URL como:

ASCII alfanumérico, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/" , ":", ";", "=", "?", "@", "_", "~" y puntos de código en los rangos 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 +60000 a U + 6FFFD, U + 70000 a U + 7FFFD, U + 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.

El término "puntos de código URL" se usa en algunas partes del algoritmo de análisis, por ejemplo, para el estado de ruta relativo :

Si c no es un punto de código URL y no es "%", analice el error.

También el validador http://validator.w3.org/ pasa por URL como "你好", y no pasa por URL con caracteres como espacios"a b"

Relacionado: ¿Qué caracteres hacen que una URL no sea válida?


Pero ambas URL ( "你好"y "a b") tienen que estar codificadas en porcentaje al hacer la solicitud HTTP ¿verdad?
Utku

@Utku porque "a b"estoy bastante seguro de que sí, ya que el espacio no está en la lista permitida arriba. Para "你好", que es sin duda la mejor idea que codifican por ciento, pero no sé si es sólo una cuestión de "las implementaciones no son lo suficientemente bueno" o el "estándar lo dice". El estándar HTML parece permitir esos caracteres. Pero creo que esto está especificado por el estándar HTTP, no HTML. Ver también: stackoverflow.com/questions/912811/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Sí, estaba pensando en el estándar HTTP, no en HTML.
Utku

5

Como todos estos comentarios son ciertos, debe tener en cuenta que, en la medida en que la ICANN haya aprobado que los caracteres árabes (persas) y chinos se registren como nombre de dominio, todas las empresas de creación de navegadores (Microsoft, Mozilla, Apple, etc.) deben admite Unicode en URL sin ninguna codificación, y Google debería poder buscarlas, etc.

Entonces este problema se resolverá lo antes posible.


2
@Nasser: Cierto, ahora también tenemos caracteres especiales en dominios alemanes, pero estos están codificados en caracteres ASCII usando Punycode . Si bien están seguros de que funcionan en los principales navegadores, pasará mucho tiempo antes de que todas las bibliotecas de clientes HTTP y aplicaciones exóticas puedan manejar caracteres Unicode no codificados.
Pekka,

@Pekka, no estoy seguro, pero como escuché, todos los navegadores deben admitir URL Unicode en el cuarto trimestre de 2010. (No estoy seguro)
Nasser Hadjloo

El problema se complica por el hecho de que no todos los agentes de usuario son un navegador web. El ejemplo más grande es el propio Google: no utiliza navegadores web comunes para rastrearlo. Lo mismo ocurriría con muchas bibliotecas para la interacción API, etc., etc. - Las URL están casi literalmente en todas partes, no solo en la WWW. Probablemente incluso en su sistema de archivos en este momento.
Cornelius el

1

Use forma codificada porcentual . Algunas computadoras (principalmente antiguas) con Windows XP, por ejemplo, no admiten Unicode, sino codificaciones ISO. Esa es la razón por la cual se inventaron las URL codificadas en porcentaje. Además, si le da a un usuario una URL impresa en papel, que contiene caracteres que no se pueden escribir fácilmente, ese usuario puede tener dificultades para escribirla (o simplemente ignorarla). La forma codificada en porcentaje puede incluso usarse en muchas de las máquinas más antiguas que existieron (aunque, por supuesto, no admiten Internet).

Sin embargo, hay un inconveniente, ya que los caracteres codificados en porcentaje son más largos que los originales, lo que posiblemente da como resultado URL muy largas. Pero solo trate de ignorarlo, o use un acortador de URL (recomendaría goo.gl en este caso, que hace una URL de 13 caracteres de longitud). Además, si no desea registrarse para una cuenta de Google, pruebe bit.ly (bit.ly crea URL un poco más largas, con una longitud de 14 caracteres).


¿Por qué querría admitir computadoras obsoletas que todavía usan Windows XP?
Mateus Felipe

0

Para mí esta es la forma correcta, esto simplemente funcionó:

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

Esto funcionó, y ahora los enlaces se muestran correctamente:

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

Enlace encontrado en:

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


2
"los enlaces se muestran correctamente", ¡excepto que el analizador de reducción de StackOverflow no interpreta las URL como se esperaba!
MrWhite
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.