# Punycode em nomes de domínio internacionalizados

Punycode é um **protocolo de codificação** padronizado, que transforma cadeias de caracteres Unicode em [cadeias de caracteres ASCII](https://www.ionos.com/digitalguide/server/know-how/ascii-codes-overview-of-all-characters-on-the-ascii-table/ "Tabela de códigos ASCII"). Isso permite que [nomes de domínio internacionalizados (IDNs)](https://www.ionos.com/pt-br/digitalguide/dominios/administracao-de-dominios/idn-dominio-internacionalizado/) contenham caracteres não ASCII, como tremas.

## Desenvolvimento do protocolo de codificação Punycode

O protocolo do Punycode foi padronizado em 2003 pela IETF (*Internet Engineering Task Force*), como a sintaxe a ser aplicada na **codificação de IDNs** (Nomes de Domínio Internacionalizados). É importante esclarecer que a IETF define IDNs como nomes de domínio que contêm caracteres não latinos, como tremas ou outros símbolos usados por alguns idiomas estrangeiros. Estes são incompatíveis com protocolos básicos, como os do [Sistema de Nomes de Domínio (DNS)](https://www.ionos.com/digitalguide/server/know-how/name-resolution-online-what-is-a-dns-server/ "Servidor DNS para resolução de nomes"), não podendo, assim, serem processados.

Um nome de domínio alemão, como *müller-büromöbel*, pode ser registrado sob o domínio nacional de nível superior (ccTLD) *.de*, desde a liberação de IDNs. Entretanto, este domínio precisa passar por um processo de codificação para ir à resolução de nomes. Como grande parte dos protocolos da internet são baseados no idioma inglês, eles só suportam conjuntos limitados de caracteres ASCII.

Para garantir que IDNs sejam compatíveis também com padrões mais antigos da internet, o IETF estipulou que nomes de domínio internacionalizados devem ser codificados utilizando somente esses caracteres limitados. Para padronizar a codificação, um protocolo nomeado de **Punycode** foi criado.

Nota Para endereços de e-mail, o Punycode é aplicado somente a domínios de e-mail internacionalizados. Já a parte local (antes do *@*) é codificada por UTF-8 quando contém caracteres não ASCII.

## Como funciona a codificação Punycode?

### Resumo do protocolo Punycode

O protocolo Punycode, definido pelo IETF, pode ser encontrado em [RFC 3492](https://datatracker.ietf.org/doc/html/rfc3492 "Punycode: A Bootstring encoding of Unicode — datatracker.ietf.org"). Ele define como aplicar um algoritmo de codificação geral, ***boostring***, que permite que strings de conjuntos de caracteres arbitrários sejam mapeadas exclusivamente por uma seleção definida de elementos. Na codificação Punycode, estes elementos são chamados de**caracteres base** e compostos de letras minúsculas, dígitos e hifens (-).

O desenvolvimento do protocolo de codificação Punycode foi baseado em seis princípios:

- **Completude:** Cada string de saída pode ser mapeada como string simplificada por ***bootstring***.
- **Exclusividade:** A atribuição da string de saída à respectiva codificação ***bootstring*** é exclusiva. A cada Punycode é atribuída exatamente uma contraparte ASCII, e vice-versa.
- **Reversibilidade:** A codificação da string inicial pode ser revertida a qualquer momento, sem que haja qualquer perda de informação.
- **Eficiência:** A cadeia codificada pode ser, se necessário, minimamente mais longa que a cadeia original.
- **Simplicidade:** O ***bootstring*** utiliza algoritmos simples de codificação e decodificação.
- **Legibilidade:** Somente caracteres que não podem ser representados pelo conjunto de caracteres básicos são codificados. Todos os outros permanecem inalterados.

O Punycode especifica o ***bootstring*** a ser usado, levando em conta os requisitos para nomes de domínio internacionalizados. Assim, o mapeamento de caracteres Unicode se sobrepõe ao de caracteres básicos (e permitidos).

### Exemplo

Observe o seguinte exemplo de codificação Punycode:

**IDN:** *müller-büromöbel*

O nome de domínio internacionalizado *müller-büromöbel* contém dois caracteres, *ü* e *ö*, que não são atualmente permitidos para nomes de domínio. Assim sendo, eles devem ser codificados por Punycode para que passem a ser compatíveis.

**Passo 1: Normalização**

O primeiro passo do procedimento de codificação prevê a **normalização** da cadeia de caracteres inicial. Assim, todas as letras maiúsculas são substituídas pelas letras minúsculas correspondentes. Outros caracteres não básicos também passam por um processo de resolução.

**Passo 2: Eliminação de todos os caracteres não básicos**

Na segunda etapa, **todos os caracteres não básicos são excluídos** e adicionados ao nome de domínio em formato codificado, separados por um hífen.

Se o protocolo Punycode for usado para codificar endereços web, cada string de resultado será fornecida com o chamado **prefixo ACE** (abreviação de *ASCII Compatible Encoding*, ou Codificação Compatível com ASCII):

**Prefixo ACE:** *xn--*

O prefixo ACE garante que nomes de domínio que simplesmente contêm hifens não sejam interpretados erroneamente como nomes de domínio internacionalizados.

Assim, o IDN *müller-büromöbel* passará a ter a seguinte codificação:

**ACE:** *xn–mller-brombel-rmb4fg*

Interessante observar o algoritmo associado ao protocolo Punycode. Ele garante que, apesar da conversão, nenhum dos rótulos de domínio exceda o **comprimento máximo de 63 caracteres**.

Durante o processo de codificação, caracteres Unicode não são convertidos, um por um, em caracteres ASCII. Em vez disso, o algoritmo calcula a cadeia de caracteres baseando-se na distância entre os caracteres excluídos e a posição dos caracteres na cadeia de saída.

No nosso exemplo, a cadeia *rmb4fg* indica que *mller-brombel* deve ser complementado com os caracteres Unicode *ü* e *ö* na segunda e na sétima casa.

[![Imagem: Partes de uma string ACE](https://www.ionos.com/pt-br/digitalguide/fileadmin/_processed_/5/4/csm_exemplo-de-codificacao-punycode_1b98889b22.webp "Partes de uma string ACE")](https://www.ionos.com/pt-br/digitalguide/fileadmin/DigitalGuide/Schaubilder/exemplo-de-codificacao-punycode.png) Uma string ACE é composta de um prefixo ACE e de uma string codificada por Punycode ### Exceções

Domínios que não contém nenhum caractere básico, ou somente caracteres não básicos, são tratados de forma especial.

Um nome de domínio que só utiliza caracteres não básicos exibe apenas a cadeia de caracteres codificada e o prefixo ACE após o processo de codificação. O nome de domínio *παράδειγμα* (“exemplo” escrito em grego) passaria a ter a seguinte codificação:

**IDN:** *παράδειγμα*

**ACE:** *xn–hxajbheg2az3al*

Se um nome de domínio contiver apenas caracteres básicos, ele não passa por uma codificação Punycode e, por isso, não ganha um prefixo ACE. A codificação não é necessária neste caso, porque o nome de domínio já é compatível com os protocolos básicos da internet.

Se observarmos a integralidade do [Nome de Domínio Totalmente Qualificado (FQDN)](https://www.ionos.com/digitalguide/domains/domain-administration/fqdn-fully-qualified-domain-name/ "FQDN: Nome de Domínio Totalmente Qualificado"), veremos que cada rótulo (domínio de nível superior, domínio de segundo nível, domínio de terceiro nível etc.) é codificado separadamente. O domínio fictício *пример.бг* (búlgaro para *exemplo.bg*) seria, portanto, codificado da seguinte forma:

**IDN:** *пример.бг*

**ACE:** *xn–e1afmkfd.xn–90ae*

A tabela abaixo exemplifica algumas variações do protocolo Punycode

<table>
  <thead>
    <tr>
      <th></th>
      <th><strong>IDN</strong></th>
      <th><strong>Punycode</strong></th>
      <th><strong>ACE</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Caracteres básicos e não básicos</strong></td>
      <td>`müller-büromöbel.de`</td>
      <td>`mller-brombel-rmb4fg.de`</td>
      <td>`xn--mller-brombel-rmb4fg.de`</td>
    </tr>
    <tr>
      <td><strong>Só caracteres não básicos</strong></td>
      <td>`Παράδειγμα.gr`</td>
      <td>`hxajbheg2az3al.gr`</td>
      <td>`xn--hxajbheg2az3al.gr`</td>
    </tr>
    <tr>
      <td><strong>Só caracteres básicos</strong></td>
      <td>`exemplo.org`</td>
      <td>`exemplo.org`</td>
      <td>Não é utilizado</td>
    </tr>
  </tbody>
</table>

Nota O algoritmo associado ao Punycode é descrito, em detalhes, pelo documento RFC 3492. Além disso, ele exemplifica a implementação deste protocolo de codificação utilizando a linguagem de programação C.

A maioria das pessoas utiliza conversores de Punycode (*Punycode converter*) gratuitos ao codificar nomes de domínio internacionalizados.

### Punycode para codificar domínios com emoji

Não apenas nomes de domínio internacionalizados, mas também domínios com emoji podem ser resolvidos pelo Punycode. Contudo, para que a conversão seja possível, o respectivo domínio de nível superior deve permitir o uso de emojis. Da mesma forma, o emoji desejado deve ter sido registrado também em padrão Unicode para funcionar.

Tecnicamente, domínios com emoji são processados pelo Punycode. Contudo, neste caso, o endereço web deve ser exibido combinando texto e emoji.

**Emoji-Domain:** `https://i❤.ws/`

**ACE:** `https://xn--i-7iq.ws/`

Atualmente, nenhum navegador padrão, como Firefox, Chrome, Safari, Edge e Opera, suporta a exibição de domínios com emoji. Caso você insira um deles na barra de endereços, este será exibido como sequência ACE.

## Punycode converter gratuito

Você pode encontrar diversos *Punycode converter* na internet, que traduzem IDNs em representações compatíveis com ASCII gratuitamente.

O site [Punycoder.com](https://www.punycoder.com/ "Puycoder.com"), por exemplo, converte nomes de domínio internacionalizados em cadeias de caracteres ASCII. Ainda, ele é capaz de fazer a conversão oposta, traduzindo cadeias ASCII em cadeias Unicode com facilidade.

[![Imagem: Punycode converter do Punycoder.com](https://www.ionos.com/pt-br/digitalguide/fileadmin/_processed_/5/f/csm_punycoder-punycode-converter_b6429ae045.webp "Punycode converter do Punycoder.com")](https://www.ionos.com/pt-br/digitalguide/fileadmin/DigitalGuide/Screenshots_2023/punycoder-punycode-converter.png) O Punycoder resolve nomes IDNs em ASCII Também recomendamos o [Punycode converter by Mathias Bynens](https://mothereff.in/punycode "Punycode converter by Mathias Bynens"), que é baseado em [punycode.js](https://github.com/mathiasbynens/punycode.js "Punycode.js — GitHub").

[![Imagem: O Punycode converter desenvolvido por Mathias Bynens usa punycode.js](https://www.ionos.com/pt-br/digitalguide/fileadmin/_processed_/c/4/csm_punycode-converter-baseado-em-js_c1465c3b01.webp "O Punycode converter desenvolvido por Mathias Bynens usa punycode.js")](https://www.ionos.com/pt-br/digitalguide/fileadmin/DigitalGuide/Screenshots_2023/punycode-converter-baseado-em-js.png) Ferramenta de código aberto converte nomes de domínio internacionalizados ## Quais são os riscos do Punycode?

O Punycode é especialmente vulnerável a **ataques homográficos**, um crime cibernético de *phishing* no qual hackers tiram proveito da semelhança entre caracteres para atrair vítimas desavisadas a sites falsos. O [blogueiro Xudong Zheng](https://www.xudongz.com/blog/2017/idn-phishing/ "IDN Phishing — xudongz.com") mostra como aparenta um [ataque de *phishing*](https://www.ionos.com/digitalguide/server/security/what-is-phishing/ "O que é phishing") que faz uso de um Punycode URL. O exemplo dele utiliza o Punycode URL `https://www.xn--80ak6aa92e.com/`, que leva usuários da internet a um site com o seguinte IDN: `https://www.аррӏе.com/`.

O problema é que o Punycode URL acima não corresponde ao site oficial da empresa estadunidense de tecnologia Apple Inc., mas a um site de *phishing* criado para fins de demonstração.

Em vez do caractere ASCII *a* (Unicode U+0061) o *a* cirílico é usado (U+0430). Difíceis de serem diferenciados a olho nu, eles são interpretados de maneira totalmente diferente pelos navegadores, o que é uma grande desvantagem do sistema. **Certificados também não garantem a segurança**, pois criminosos costumam emitir certificados SSL válidos para sites de *phishing* modernos, o que transmite ainda mais a impressão de legitimidade.

[![Imagem: Exemplo de um ataque homográfico](https://www.ionos.com/pt-br/digitalguide/fileadmin/_processed_/b/1/csm_exemplo-de-ataque-homografico_724a693e61.webp "Exemplo de um ataque homográfico")](https://www.ionos.com/pt-br/digitalguide/fileadmin/DigitalGuide/Screenshots_2023/exemplo-de-ataque-homografico.png) Exemplo de domínio homográfico: o URL corresponde visualmente ao do site oficial da Apple, mas, na verdade, o caractere cirílico Unicode U+0430 é usado ao invés do caractere ASCII a. Ambos são incrivelmente parecidos. **Usuários do navegador Firefox podem se proteger** deste tipo de ataque. Para reduzir o risco de *phishing* homográfico, impeça a tradução Punycode de IDNs. Siga estes dois passos:

1. **Acesse o editor de configuração**: Digite *about:config* na barra de endereços do navegador para abrir o editor de configuração do Firefox.
2. **Altere o Punycode**: Encontre a configuração *network.IDN\_show\_punycode* e modifique o valor de *false* para *true*.

Se você fizer isso, seu navegador Firefox passará a exibir domínios internacionalizados como cadeias de caracteres ACE na barra de endereços.


This is a markdown version of: [https://www.ionos.com/pt-br/digitalguide/dominios/administracao-de-dominios/punycode/](https://www.ionos.com/pt-br/digitalguide/dominios/administracao-de-dominios/punycode/) for AI/LLM consumption.