EmoArt
发布
术语表

什么是 Punycode

最近更新: 2026-05-22·约 4 分钟

本文约 4 分钟读完。

在地址栏输入「日本.jp」,显示的却是「xn--wgv71a.jp」。负责这一转换的就是 Punycode。域名传统上只能使用 ASCII 英数字和连字符。为了处理包含日文或 emoji 的国际化域名 (IDN), Punycode 作为将非 ASCII 字符编码为 ASCII 的机制被标准化了。虽然平时不太会注意到, 但它在浏览器地址栏和安全机制的背后发挥着重要作用。

定义

Punycode 是一种将 Unicode 字符串编码为仅含 ASCII 有限字符集 (a-z、0-9、连字符) 的转换算法。 它由 RFC 3492 标准化,作为国际化域名 (IDN, Internationalized Domain Names) 的核心技术, 使包含非 ASCII 字符的域名能够在现有 DNS 基础设施上运行。转换结果以「xn--」作为前缀。

为什么需要它

DNS (域名系统) 在 1980 年代设计时,域名被限制为 ASCII 英数字和连字符。 进入 2000 年代后,支持全球各种语言的需求日益增长,但重写现有 DNS 基础设施并不现实。 于是 Punycode 作为「ASCII 兼容编码 (ACE)」被提出, 实现了向 DNS 传递 ASCII 字符串、同时向用户展示原始语言文字的机制。

转换示例

原始域名Punycode 表示
日本.jpxn--wgv71a.jp
München.dexn--mnchen-3ya.de
правда.рфxn--80aafi6cg.xn--p1ai
💩.la (emoji 域名)xn--ls8h.la

xn-- 前缀的含义

转换结果开头必定带有的「xn--」是一个标识符,表示「这是经过 Punycode 编码的字符串」。 DNS 解析器、TLS 证书和邮件服务器通过识别这个前缀来判断「这是 ASCII 化的 IDN」。 前缀本身没有特殊含义,它是为了与不支持 Unicode 的旧系统保持向后兼容而选定的标识符。

emoji 域名的现实

从技术上讲,将包含 emoji 的域名 (过去在 .la 或 .ws 等部分 TLD 可以注册) 进行 Punycode 转换是可行的。 但在实用层面存在以下问题:

  • Chrome、Firefox、Safari 等主流浏览器会在地址栏将 emoji 域名切换为 Punycode 显示
  • 许多邮件服务器会拒绝 emoji 域名
  • 在社交媒体链接预览和二维码中难以辨认
  • 口头向他人传达极为困难

虽然作为品牌话题营销可能一时引起关注,但作为企业主域名来说并不具备实用性。

安全方面的课题

同形字攻击

利用不同语言中外观相同的字符 (如西里尔字母的 "а" U+0430 和拉丁字母的 "a" U+0061) 组合, 创建与正规域名无法区分的攻击域名的手法。

  • 正规:apple.com
  • 伪造:аpple.com (第一个 "а" 是西里尔字母)

当浏览器检测到域名中混合了多种文字系统或特定的同形字模式时,会自动切换为 Punycode 显示以警告用户。 Chrome 在检测到混合脚本并判断「可能是同形字攻击」时,会以 Punycode 形式显示域名。

钓鱼防护

在企业安全对策中,监控与自家品牌相似的 IDN 域名已成为常规做法。 市面上已有服务专门监控看起来像「apple」「google」「microsoft」等主要品牌的 Unicode 字符组合。

实务中的处理方式

  • 域名注册:日文域名会被 Punycode 化后注册到 DNS。需要同时考虑显示和内部实现
  • 邮件发送:发件人或收件人邮箱地址的域名使用非 ASCII 字符时,对方邮件服务器可能会拒收
  • SSL 证书:大多数证书颁发机构支持 IDN,但证书中以 Punycode 形式记载
  • Web 链接:即使在 HTML 的 href 中写入日文域名,浏览器也会自动转换为 Punycode 进行通信

常见误解

  • ❌「Punycode 是日文专用的」→ ✅ 支持所有 Unicode 字符
  • ❌「emoji 域名可以正常使用」→ ✅ 在主流浏览器中会显示为 Punycode,实用性很低
  • ❌「xn-- 是无关紧要的前缀」→ ✅ 它是 Punycode 化域名的必要标识符

相关术语

  • Unicode - Punycode 所编码的字符规格
  • Emoji - 用于 emoji 域名的 Unicode 字符

这篇文章对你有帮助吗?