📜  Node.js 中的 Punycode 是什么?

📅  最后修改于: 2022-05-13 01:56:18.529000             🧑  作者: Mango

Node.js 中的 Punycode 是什么?

Punycode 是一种特殊的编码语法,专门用于将 Unicode字符(UTF-8) 转换为 ASCII,它只不过是受限制的字符串字符集。

为什么需要这种类型的特定转换?主机名只能理解 ASCII字符。国际域名 (IDN) 使用 Punycode 对在浏览器中输入的 URL 进行编码/解码。
例如:如果您在浏览器中搜索mañana.com ,您的浏览器具有内置的 IDNA 服务,在浏览器中嵌入的 Punycode 转换器的帮助下将其转换为xn--maana-pta.com

现在让我们看看如何在 Node.js 的帮助下使用 Punycode。

Node.js 中的 Punycode: Punycode 与 node.js v0.6.2 及更高版本捆绑在一起。如果你想使用 Punycode,你需要使用 npm 安装来安装 Punycode 模块。

npm 安装:

npm install punycode --save 

包括 punycode 模块:

const punycode = require('punycode');

punycode.decode(字符串):用于将 ASCII 的 Punycode字符串转换为 Unicode 符号。

例子:

// 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'));

输出:

punycode.encode(字符串):用于将 Unicode字符串转换为 ASCII 符号的 Punycode字符串。

例子:

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

输出:

manama-pta
--dqo34k

punycode.toUnicode(input):用于将表示域名或电子邮件地址的 Punycode字符串转换为 Unicode 符号。在已经转换的 Unicode 上调用它并不重要。

例子:

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

输出:

punycode.toASCII(input):用于将表示域名或电子邮件地址的小写 Unicode字符串转换为 Punycode 符号。用一个已经是 ASCII 的域来调用它并不重要。

例子:

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

输出:

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

punycode.ucs2.decode(字符串):为字符串中的每个 Unicode 代码符号创建一个数字代码点值数组。在内部基于 Javascript 构建的浏览器的幕后,其中的 UCS-2函数将转换一对代理 半成 一个单一 的 编码 点.

例子:

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

输出:

[ 97, 98, 99 ]
[ 119558 ]

UCS-2: UCS-2 是一个 2 字节的通用字符集,它通过使用 16 位代码单元来生成固定长度的格式。代码点范围从 0 到 0xFFFF。

代理对: BMP 之外的字符,例如 U+1D306 TETRAGRAM FOR CENTRE:,只能使用两个 16 位代码单元进行编码。这被称为“代理对”。代理对只代表一个单独的字符。

punycode.ucs2.encode(codePoints):用于根据数字代码点值数组创建字符串。

例子:

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

输出:

abc
𝌆

你可以看到
Punycode Converter 查看实时结果。