it-swarm.dev

Caracteres Unicode em URLs

Em 2010, você veicularia URLs com caracteres UTF-8 em um grande portal da web?

Caracteres Unicode são proibidos de acordo com o RFC nas URLs (veja aqui ). Eles teriam que ser percentualmente codificados para serem compatíveis com os padrões.

Meu ponto principal, no entanto, é veicular os caracteres não codificados com o único propósito de ter URLs com boa aparência, de modo que a codificação de porcentagem está fora.

Todos os principais navegadores parecem estar analisando esses URLs, não importa o que o RFC diga. Minha impressão geral, porém, é que fica muito instável ao sair do domínio dos navegadores da web:

  • URLs obtendo cópia + colados em arquivos de texto, e-mails, até mesmo sites com uma codificação diferente
  • Bibliotecas do cliente HTTP
  • Navegadores exóticos, leitores de RSS

A minha impressão é correta de que o problema deve ser esperado aqui e, portanto, não é uma solução prática (ainda) se você está servindo a um público não técnico e é importante que todos os seus links funcionem corretamente, mesmo que citados e transmitidos?

Existe alguma maneira mágica de servir URLs com boa aparência em HTML

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

que pode ser copiado + colado com os caracteres especiais intactos, mas funciona corretamente quando reutilizado em clientes mais antigos?

130
Pekka 웃

Use a codificação de porcentagem. Os navegadores modernos cuidam dos problemas de exibição e colagem e os tornam legíveis para humanos. Por exemplo. http://ko.wikipedia.org/wiki/ 위키 백과: 대문

Edit: quando você copia uma url no Firefox, a área de transferência contém o formato percentual (que geralmente é bom), mas se você copiar apenas uma parte dele, ele permanecerá sem codificação.

118
Tgr

O que Tgr disse. Fundo:

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

Isso não é um URI. Mas isso é um IRI .

Você não pode incluir um IRI em um documento HTML4; o tipo de atributos como href é definido como URI e não IRI. Alguns navegadores lidam com um IRI aqui de qualquer maneira, mas não é uma boa ideia.

Para codificar um IRI em um URI, pegue o caminho e consulte as partes, codifique-as em UTF-8 e, em seguida, codifique em porcentagem os bytes não-ASCII:

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

Se houver caracteres não-ASCII na parte do nome do host do IRI, por exemplo. http://例え.テスト/, eles foram codificados usando Punycode .

Agora você tem um URI. É uma URI feia. Mas a maioria dos navegadores ocultará isso para você: copie e cole na barra de endereço ou siga-a em um link e você verá que ela é exibida com os caracteres Unicode originais. A Wikipedia tem usado isso há anos, por exemplo:

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

O único navegador cujo comportamento é imprevisível e nem sempre exibe a versão bonita do IRI é ...

...bem, você sabe.

85
bobince

Dependendo do seu esquema de URL, você pode tornar a parte codificada em UTF-8 "não importante". Por exemplo, se você observar os URLs de estouro de pilha, eles terão o seguinte formato:

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

No entanto, o servidor não se importa se você pegar a parte após o identificador errado, então isso também funciona:

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

Então, se você tivesse um layout como esse, então você poderia usar UTF-8 na parte depois do identificador e não importaria se ele fosse distorcido. Claro que isso provavelmente só funciona em circunstâncias um pouco especializadas ...

14
Dean Harding

Não tenho certeza se é uma boa idéia, mas como mencionado em outros comentários e como eu o interpreto, muitos caracteres Unicode são válidos em URLs HTML5 .

Por exemplo, href docs diz http://www.w3.org/TR/html5/links.html#attr-hyperlink-href :

O atributo href nos elementos a e area deve ter um valor que seja uma URL válida potencialmente cercada por espaços.

Em seguida, a definição de "URL válida" aponta para http://url.spec.whatwg.org/ , que define pontos de código de URL Como:

ASCII alfanumérico, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/" , ":", ";", "=", "?", "@", "_", "~" e pontos de código nos intervalos U + 00A0 a U + D7FF, U + E000 a U + FDCF , U + FDF0 para U + FFFD, U + 10000 para U + 1FFFD, U + 20000 para U + 2FFFD, U + 30000 para U + 3FFFD, U + 40000 para U + 4FFFD, U + 50000 para U + 5FFFD, U +60000 para U + 6FFFD, U + 70000 para U + 7FFFD, U + 80000 para U + 8FFFD, U + 90000 para U + 9FFFD, U + A0000 para U + AFFFD, U + B0000 para U + BFFFD, U + C0000 para U + CFFFD, U + D0000 para U + DFFFD, U + E1000 para U + EFFFD, U + F0000 para U + FFFFD, U + 100000 para U + 10FFFD.

O termo "pontos de código de URL" é então usado em algumas partes do algoritmo de análise, e. para o estado do caminho relativo :

Se c não é um ponto de código de URL e não "%", erro de análise.

Além disso, o validador http://validator.w3.org/ passa por URLs como "你好" e não passa por URLs com caracteres como espaços "a b"

Como todos esses comentários são verdadeiros, você deve notar que até ICANN caracteres em árabe (persa) e chinês aprovados para serem registrados como Nome de Domínio, todas as empresas criadoras de navegador (Microsoft, Mozilla, Apple, etc.) têm que suportar Unicode em URLs sem qualquer codificação, e esses devem ser pesquisáveis ​​pelo Google, etc.

Então, esse problema irá resolver o mais rápido possível.

4
Nasser Hadjloo

Use o formulário codificado por percentual . Alguns (principalmente antigos) computadores que executam o Windows XP por exemplo, não suportam Unicode, mas sim codificações ISO. Essa é a razão pela qual os URLs codificados por porcentagem foram inventados. Além disso, se você fornecer uma URL impressa em papel para um usuário, contendo caracteres que não podem ser digitados facilmente, esse usuário poderá ter dificuldade em digitá-lo (ou simplesmente ignorá-lo). A forma codificada percentual pode até ser usada em muitas das máquinas mais antigas que já existiram (embora elas não suportem internet, é claro).

Há uma desvantagem, no entanto, como os caracteres codificados por porcentagem são mais longos que os originais, possivelmente resultando em URLs realmente longas. Mas apenas tente ignorá-lo, ou use um encurtador de URL (eu recomendaria goo.gl neste caso, o que faz uma URL longa de 13 caracteres). Além disso, se você não quiser se inscrever em uma Conta do Google, tente bit.ly (o bit.ly faz URLs um pouco mais longos, com o comprimento de 14 caracteres).

1
EKons

Para mim esta é a maneira correta, Isso só funcionou:

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

Isso funcionou e agora os links são exibidos corretamente:

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

Link encontrado em:

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

0
Peter Manoukian