本文目录
什么是 Punycode?
Punycode 是 RFC 3492 中定义的一种编码语法,它将 Unicode 字符转换为域名系统(DNS)所使用的有限 ASCII 字符集。它使国际化域名(IDN)——即包含重音符号、汉字或阿拉伯文字等非 ASCII 字符的域名——能够在仅支持 ASCII 的 DNS 基础设施中正常工作。
经过 Punycode 编码的域名会带有 xn-- 前缀(即 ACE 前缀),用以标示其中含有编码后的 Unicode。例如,域名 munchen.de 经 Punycode 编码后变为 xn--mnchen-3ya.de。Punycode 转换工具可在人类可读的 Unicode 形式与 DNS 兼容的 ASCII 形式之间进行相互转换。
Punycode 编码的工作原理
Punycode 使用一种 bootstring 算法,将 Unicode 码位表示为一串基本 ASCII 字符(a-z、0-9 和连字符)。
- Unicode 分离——编码器识别出哪些是基本 ASCII 字符(原样保留),哪些是非 ASCII 字符(需要编码)
- 增量编码——非 ASCII 字符被编码为表示其位置和码位的数值增量,并压缩成 36 进制数字
- ACE 前缀——最终的编码字符串前会加上 xn-- 前缀,将其标记为 Punycode,从而生成 DNS 所使用的 ACE(ASCII 兼容编码)形式
免费试用 —— 无需注册
转换 Punycode →何时使用 Punycode
只要你在仅支持 ASCII 的系统中处理国际化域名,就需要进行 Punycode 转换。
- 域名注册——注册商要求以 Punycode 形式注册 IDN 域名,WHOIS 查询也使用 xn-- 编码形式
- 含国际化域名的电子邮件——诸如 user@munchen.de 这样的邮箱地址,必须转换为 user@xn--mnchen-3ya.de 才能通过 SMTP 投递
- DNS 配置——DNS 区域文件和记录对任何包含非 ASCII 字符的域名标签均使用 Punycode 形式
常见问题
Punycode 和 URL 编码是一回事吗?
不是。URL 编码(百分号编码)将字符转换为 %XX 十六进制序列,用于 URL 路径和查询字符串。Punycode 则专门将 Unicode 域名标签编码为 ASCII,供 DNS 使用。它们解决的是不同的问题——URL 编码用于 URL,Punycode 用于域名。
Punycode 会被用于钓鱼攻击吗?
会,这被称为 IDN 同形异义攻击。攻击者注册的域名中使用了看起来与拉丁字母完全相同的 Unicode 字符(例如西里尔字母“a”与拉丁字母“a”)。现代浏览器通过对可疑的混合文字域名显示其 Punycode xn-- 形式来加以防范。
所有浏览器都支持国际化域名吗?
是的。所有现代浏览器都会自动将 IDN 域名转换为 Punycode 以进行 DNS 解析,并在地址栏中显示其 Unicode 形式。这一转换对用户是透明的。不过,作为一种钓鱼防护措施,浏览器可能会对混用多种文字的域名显示其 Punycode 形式。