Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

URLs em ASCII

As URLs, em qualquer idioma ou país devem ser sempre escrita com US ASCII , ou seja, com 7 bits possíveis ?

Obrigado.

9 respostas

Não, é possível ter com muito mais caracteres.

Existe um protocolo chamado Punycode, que permite a utilização de outros caracteres, mas é como se fosse uma "máscara", por exemplo, este site chinês: http://見.香港/

Você navega normalmente, mas se você copiar a url da barra de endereço do chrome, uma vez que você já está no site, ele é convertido para: http://xn--nw2a.xn--j6w193g/

Você pode fazer um teste, coloque o seguinte endereço no seu chrome: http://xn--cano-ioax.com.br

Ele está em punycode, e será convertido para outro endereço.

Eu nunca trabalhei com um site que utilize isso. Mas é possível ter outros caracteres sim em url.

Apenas para complementar, segue uma ferramenta online para fazer conversões:

https://www.punycoder.com/

Oi Marcelo, exato => https://www.ietf.org/rfc/rfc1738.txt

O documento que o Alberto passou, está correto.

Em 1994 foi estabelecido o padrão para apenas caracteres ASCII.

Entretanto, em 2003, como mostra este link do mesmo site: https://tools.ietf.org/rfc/rfc3492.txt

Foi estabelecido o punycode, para permitir a internacionalização de domínios. Tornando possível ter uma url em qualquer idioma do mundo, como chinês, russo, árabe, etc...

Imagine por exemplo, a dificuldade que uma pessoa na Rússia teria de digitar ou mesmo falar um endereço para alguém, sendo que eles não utilizam o mesmo alfabeto que nós.

Para isso foi criado o punycode.

Por baixo dos panos, ou seja, no protocolo HTTP, são trafegados em endereços de url apenas o padrão ASCII.

Mas nada impede de ter um domínio com outros caracteres.

Agora fiquei um pouco em dúvida sobre sua pergunta, se você se referia à comunicação do protocolo HTTP ou também envolvia o registro de domínios.

A resposta de Adriano foi super completa! e eu lembro disso mesmo, que os domínios no brasil por exemplo, poderiam ter acentos etc...

Adriano,

Antes de tudo obrigado pela resposta. Foi bem completa. Mas vamos lá porque tudo isso é novo pra mim:

1) "Existe um protocolo chamado Punycode, que permite a utilização de outros caracteres, mas é como se fosse uma "máscara", por exemplo, este site chinês: http://見.香港/ "

Nunca tinha ouvido falar do Punycode. É Unicode? Eu posso trabalhar com Unicode ou com ASCII apenas na URL afinal de contas? Como assim "máscara" ?

2) "Você navega normalmente, mas se você copiar a url da barra de endereço do chrome, uma vez que você já está no site, ele é convertido para: http://xn--nw2a.xn--j6w193g/ "

Bem, digitei a URL em chinês mesmo no Chrome e ele não converteu para essa outra URL.

Outra coisa: como o navegador saberá que xn--nw etc etc equivale a canção.com.br?

Obrigado desde já !!!

solução!

Marcelo, é bem simples.

Seguem as respostas de cara item:

Nunca tinha ouvido falar do Punycode. É Unicode?

Não é unicode, é um protocolo apenas para que os softwares, no caso os navegadores, exibam para o usuário o caracter especial que você quiser, mas como falei, por baixo dos panos é US ASCII apenas.

Eu posso trabalhar com Unicode ou com ASCII apenas na URL afinal de contas?

você pode divulgar aos usuários endereços com caracteres especiais, mas é recomendado apenas usar no nome do domínio ou subdomínio.

O punycode é um protocolo IDN (Internationalized Domain Name), ou seja, apenas para nomes de domínios.

Se você tentar acessar por exemplo: http://canção.com.br/música/يومجميل

Claro que o endereço acima é fictício, o navegador mostrará na barra de endereço os caracteres especiais.

Após inserir, copie e cole esse mesmo endereço em um bloco de notas. Copiando da barra de endereço do navegador, o resultado será esse: http://xn--cano-ioax.com.br/m%C3%BAsica/%D9%8A%D9%88%D9%85%D8%AC%D9%85%D9%8A%D9%84

A primeira parte foi codificada como punycode, e o restante como URI que estamos acostumados.

Ou seja, o trecho final: يومجميل

Não foi convertido para punycode, mas se essa string estivesse no nome do domínio, ou seja:

http://يومجميل

O navegador decodificaria como:

http://xn--rgb2cbbmle

Ou seja, aplica apenas o punycode no domínio, e não nos demais blocos do endereço.

Respondendo então a este tópico, a apresentação do domínio ao usuário pode ser com caracteres especiais, mas seu servidor deve estar preparado para receber tanto com os caracteres especiais, quanto com o punycode.

Entretanto, é seguro afirmar que o navegador irá transmitir ao servidor o punycode, ou seja US ASCII.

Para garantir o perfeito funcionamento do domínio, você deve ter tanto o registro com caracteres especiais, quando seu equivalente em ascii e em punycode, ou seja, se fosse registar o domínio do exemplo e configurar o servidor, ele deve responder a estes formatos:

http://canção.com.br

http://xn--cano-ioax.com.br

http://cancao.com.br

Assim, independente do que o usuário digite, ou como o navegador interprete, o serviço sempre funcionará. É obvio que é muito mais trabalhoso do que o de costume, mas se quer ter esse tipo de endereço, precisa se acostumar a isso.

Como assim "máscara" ?

Como demonstrado acima, o navegador se encarrega de mostrar ao usuário os caracteres especiais, mas ao inspecionar o tráfego HTTP, verá que estes especiais não foram enviados ao servidor, e sim seu equivalente em punycode, ou seja US ASCII.

Usei a palavra máscara, como uma forma de exemplificar que o usuário vê uma coisa, mas a comunicação de rede é feita com outra.

Bem, digitei a URL em chinês mesmo no Chrome e ele não converteu para essa outra URL.

Ele não vai converter na barra de endereço, como falei, o usuário sempre verá o caracter especial. A conversão acontece quando você selecionar direto da barra de endereço e copiar para um bloco de notas.

A ideia do punycode, é que na visão do usuário ele está usando caracteres especiais.

E em idiomas que possuem em seu alfabeto caracteres diferentes do padrão americano, que estes usuário possam digitar livremente o endereço como estão acostumados, ou seja, com seus símbolos e o protocolo se encarrega de "traduzir" isso para o sistema.

Usando o exemplo do post anterior, o com os caracteres em chinês, se você entrar no endereço no formato punycode, ou seja: http://xn--nw2a.xn--j6w193g/

O navegador converterá para os ideogramas, ou seja, o usuário sempre verá em seu idioma nativo.

Pessoas desses locais, estão acostumadas a trabalhar com links tanto em seus ideogramas quanto em formato punycode, para eles, tanto faz.

Mas para nós e todos os outros países cujo o alfabeto é muito próximo do americano, não vale o esforço de trabalharmos desta forma.

Este caso de uso, é como comentei, imagine um cara na China, que só fala e escreve o idioma local. Como ele iria fazer para acessar a internet? Teria que aprender um novo alfabeto?

Não necessariamente, basta ele digitar da forma mais normal possível para ele, e pronto, o site funciona.

Outra coisa: como o navegador saberá que xn--nw etc etc equivale a canção.com.br?

Isso é bem simples, veja que o punycode sempre começa com xn-- esse é o início de todo o código punycode.

Ao ver isso, o navegador tenta fazer uma conversão, se não achar um caracter especial equivalente ao restante do código, ele entende como inválido e não converte a url.

Por exemplo, esse é um código inválido punycode: http://xn--codigo-invalido-kkkkkk

Se você colocar isso no navegador, apesar de começar com xn-- ele não encontra caracteres especiais com o restante da string e o que você verá é exatamente este endereço no navegador, não irá mostrar nada de diferente.

Agora com um código válido como:

http://xn--rgb2cbbmle

Ele te mostrará uma string em Árabe, pois existem equivalentes á string informada.

Desculpe o texto gigantesco, mas acredito que consegui tirar as dúvidas.

Para fechar, no servidor você sempre deve trabalhar apenas com US ASCII, mas no domínio, você pode sim usar caracteres especiais, desde que seu sistema esteja pronto para isso.

No final das contas, tudo depende dos objetivos e o quanto vale a pena para seu sistema trabalhar com o punycode.

Este site russo por exemplo: http://правительство.рф

Ele possui o punycode no domínio, mas ao entrar ele direciona para este: http://government.ru/

Ou seja, eles não se deram ao trabalho de implantar isso no sistema, e simplesmente jogaram para outro domínio no padrão ASCII e pronto, bem mais simples.

O detalhe é que qualquer pessoa que fale somente russo, conseguirá digitar este endereço. Mesmo que seja direcionado, não faz diferença, o importante é que chegaram no site correto.

Abraços.

Muito bom, Adriano!

Aplaudindo de pé aqui, hehehe

Agora entendi. Uma dúvida: o Apache o Nginx implementam o esquema Punycode também ?

Obrigado

Sim, é suportado.

Mas a recomendação é você tenha configurado em seu virtual host como principal a string decodificada e como alias (apelido) a versão com caracteres especiais.

Algo como:

<VirtualHost *>
ServerName xn--nw2a.xn--j6w193g
ServerAlias 見.香港
DocumentRoot /good/path/to/website
</VirtualHost>

<VirtualHost *>
ServerName xn--cano-ioax.com.br
ServerAlias canção.com.br
DocumentRoot /good/path/to/website
</VirtualHost>

Isso se deve ao fato, de que o navegador irá trafegar o formato xn--, o alias apenas garante que, se por acaso uma requisição com os caracteres especiais chegue ao servidor, também seja interpretado.

O que é bem possível de ocorrer, no caso de requisições que sejam feitas diretamente ao servidor, e não necessariamente sejam convertidas para o formato punycode.

Não sei a configuração para Nginx.