Punycode é uma sintaxe de codificação especial usada especificamente para converter caracteres Unicode (UTF-8) em ASCII, que nada mais é do que o conjunto de caracteres de string restrito.

Por que esse tipo de conversão específica é necessária? Os nomes de host compreenderão apenas caracteres ASCII. Punycode é usado pelos Nomes de Domínio Internacionais (IDN) para codificar / decodificar a URL que foi digitada no navegador.
Por exemplo: Se você pesquisar mañana.com no navegador, seu navegador que possui um serviço IDNA embutido o converte para xn--maana-pta.com com a ajuda do conversor Punycode embutido no navegador.

Agora vamos ver como usar o Punycode com a ajuda do Node.js.

Punycode em Node.js: Punycode é empacotado com node.js v0.6.2 e as versões posteriores. Se quiser usar o Punycode, você precisa instalar o módulo Punycode usando a instalação npm.

instalação npm:

 npm install punycode --save 

Incluir módulo punycode:

const punycode = require('punycode');

punycode.decode (string): É usado para converter strings Punycode de ASCII em símbolos Unicode.

Exemplo:

// Include punycode module
const punycode = require('punycode');
  
// Decode Punycode strings of ASCII
// to Unicode symbols
console.log(punycode.decode('manama-pta'));
console.log(punycode.decode('--dqo34k'));

Saída:

punycode.encode (string): É usado para converter strings Unicode em strings Punycode de símbolos ASCII.

Exemplo:

// Include punycode module
const punycode = require('punycode');
  
// Encode Unicode symbols to
// Punycode ASCII string 
console.log(punycode.encode('máanama'));
console.log(punycode.encode('?-?'));

Saída:

manama-pta
--dqo34k

punycode.toUnicode (entrada): É usado para converter strings Punycode que representam um nome de domínio ou endereço de e-mail em símbolos Unicode. Não importa se você o chama em um Unicode já convertido.

Exemplo:

// Include punycode module
const punycode = require('punycode');
  
console.log(punycode.toUnicode('xn--maana-pta.com'));
console.log(punycode.toUnicode('xn----dqo34k.com'));

Saída:

punycode.toASCII (entrada): É usado para converter strings Unicode em minúsculas que representam um nome de domínio ou endereço de e-mail em símbolos Punycode. Não importa se você o chama com um domínio que já está em ASCII.

Exemplo:

// Include punycode module
const punycode = require('punycode');
  
console.log(punycode.toASCII('mañana.com'));
console.log(punycode.toASCII('?-?.com'));

Saída:

xn--maana-pta.com
xn----dqo34k.com

punycode.ucs2.decode (string): Cria uma array de valores de ponto de código numérico para cada símbolo de código Unicode na string. Nos bastidores do navegador que foi construído internamente em Javascript, a função UCS-2 nele converterá um par de metades substitutas em um único ponto codificado .

Exemplo:

// Include punycode module
const punycode = require('punycode');
  
// Decoding strings 
console.log(punycode.ucs2.decode('abc'));
console.log(punycode.ucs2.decode('\uD834\uDF06'));

Saída:

[ 97, 98, 99 ]
[ 119558 ]

UCS-2: UCS-2 é um conjunto de caracteres universais de 2 bytes que produz um formato de comprimento fixo processando uma unidade de código de 16 bits. O ponto de código varia de 0 a 0xFFFF.

Pares substitutos: caracteres que estão fora do BMP, por exemplo, U + 1D306 TETRAGRAMA PARA CENTRO :, só podem ser codificados usando duas unidades de código de 16 bits. Isso é conhecido como “pares substitutos”. Os pares substitutos representam apenas um único personagem sozinho.

punycode.ucs2.encode (codePoints): É usado para criar uma string com base na array de valores de ponto de código numérico.

Exemplo:

// Include punycode module
const punycode = require('punycode');
  
console.log(punycode.ucs2.encode([0x61, 0x62, 0x63]));
console.log(punycode.ucs2.encode([0x1D306]));

Saída:

abc
?

Você pode ver o
Punycode Converter para ver o resultado ao vivo.