Punycode 转换(国际化域名)

将包含日语等非 ASCII 字符的国际化域名(IDN)与 Punycode(ASCII 兼容编码)相互转换。

使用提示

  • 由多个标签(以 `.` 分隔的部分)组成的域名也会按标签自动判断并转换:仅含 ASCII 字符的标签保持不变,只有包含非 ASCII 字符的标签才会转换为带 `xn--` 前缀的形式。
  • 在"Punycode → 域名"模式下,只有包含 `xn--` 前缀的标签会被解码,其余标签将原样保留。
  • 该转换逻辑不仅适用于域名,也可应用于邮箱地址中 `@` 之后的部分(域名部分)。
  • 在浏览器地址栏中实际输入国际化域名时,大多数浏览器会在内部先转换为 Punycode,然后再进行 DNS 解析。

常见问题

Punycode(RFC 3492)是一种编码方式,用于将包含日语、中文、阿拉伯语等 Unicode 字符的域名(即国际化域名,IDN)转换为 DNS 能够处理的纯 ASCII 字符串。转换后的标签会带有 `xn--` 前缀。

DNS(域名系统)最初的设计只考虑了 ASCII 字符,因此包含日语字符或表情符号的域名无法直接被解析。Punycode 通过将含非 ASCII 字符的域名转换为 ASCII 字符串,使得在完全不改变现有 DNS 基础设施的前提下实现国际化域名成为可能。

`xn--` 被称为"ACE 前缀"(ASCII Compatible Encoding prefix,ASCII 兼容编码前缀),用于向 DNS 及相关软件表明该标签是经 Punycode 编码的国际化域名。浏览器等软件识别到该前缀后,通常会将其解码为原始的 Unicode 字符串显示给用户。

是的,这是一种被称为"IDN 同形字攻击"的钓鱼手段。已有报告指出,攻击者利用外观几乎相同但实际不同的字符(例如西里尔字母的"а"与拉丁字母的"a")编码生成 Punycode 域名(例如 `xn--80ak6aa92e.com`),冒充正规域名。主流浏览器的应对措施包括:当检测到可疑的字符混用时,在地址栏中保持显示 Punycode 形式(以 `xn--` 开头的字符串),而不显示解码后的内容。
ツールくん

闲话 ― "猫"与"日本語"如何变成域名的幕后故事

国际化域名(IDN)的讨论始于上世纪 90 年代后期,但标准化经历了很长时间。为了在不改变 DNS 核心结构的前提下处理非 ASCII 字符,业界曾提出多种方案,最终采用了"在应用层(客户端)完成编码与解码,DNS 服务器本身保持不变"的 Punycode 方案,并于 2003 年正式标准化为 RFC 3492。

"Punycode"这个名字据说源自"Unicode"与"an amusing pun"(有趣的双关语)的结合,其算法本身是将更通用的 Bootstring 编码方法(由 IBM 研究人员设计,用于将任意字符集编码为受限字符集的通用方法)针对域名场景加以特化而成。就连"Punycode"这个名字的由来本身也带有几分玩笑意味,颇能体现开发者社区特有的幽默感。

如今,日语域名(`.jp`)以及表情符号域名(例如确实存在的 `💩.la`)等使用各种语言和符号的域名已被实际注册和使用,但在这些域名背后,始终都要经过 Punycode 的转换处理。即便是浏览器地址栏中显示的优美的日语域名,在与 DNS 服务器通信时,实际传输的也是以 `xn--` 开头的朴素 ASCII 字符串。