IDN 与 Punycode 是什么
IDN(国际化域名)允许用中文、日文、emoji 等非 ASCII 字符注册域名。但 DNS 协议本身只认 ASCII,所以实际存储与传输使用的是 Punycode 编码(前缀为 xn--,算法见 RFC 3492),显示层再还原成 Unicode。IDNA2008(RFC 5890 至 5895)规定了转换、校验与禁止使用的字符规则。
基本信息
| 标准 | IDNA2008(RFC 5890 至 5895) |
|---|---|
| 编码算法 | Punycode(RFC 3492) |
| 前缀 | xn-- |
| 示例 | 中文.cn 对应 xn--fiq228c.cn |
| 相关能力 | SMTPUTF8(RFC 6531)支持国际化邮箱地址 |
| 常见坑 | 证书、脚本、审计比对里都必须用 Punycode |
典型使用场景
- 中文域名注册与解析验证
- 证书申请:SAN 必须按 Punycode 填写
- 品牌保护:监控同形异义(形近字符)域名
- 排障:工具显示乱码或解析失败时判断是编码问题还是域名问题
- 邮件国际化:确认网关与邮件服务器是否支持 SMTPUTF8
- 安全审计:以编码形式而非外观比对域名归属
转换与查询
转换与查询
# Unicode 与 Punycode 互转
python3 -c "print('中文.cn'.encode('idna').decode())" # xn--fiq228c.cn
python3 -c "print('xn--fiq228c.cn'.encode().decode('idna'))" # 中文.cn
# 查询时用 Punycode 形式更稳,兼容性最好
dig +short xn--fiq228c.cn AIDN 相关规矩
| 场景 | 要求 | 说明 |
|---|---|---|
| 域名注册 | 注册商按 Punycode 登记 | 后台看到的是 xn-- 形式 |
| TLS 证书 | SAN 必须用 Punycode | 通配符只覆盖对应层级 |
| 邮件地址 | 需要服务器支持 SMTPUTF8 | 老网关常不支持,会静默失败 |
| 同形异义 | 视觉相似字符易被冒用 | 钓鱼风险,审计按编码比对 |
同形异义域名可被用于钓鱼:安全审计与证书比对必须以 Punycode 形式进行,肉眼无法区分形近字符。
部分老工具与库不支持 IDN,会把 xn-- 直接显示出来;排查「域名解析异常」时先确认传递的到底是 Unicode 还是 Punycode。
中文域名在不同浏览器与系统上的显示效果不一,遇到「复制出来的域名解析不了」时,先把它转成 Punycode 再测。
同一域名的 Unicode 形式在不同规范化下可能产生不同编码,注册与校验时应以注册商返回的 Punycode 为准。
国际化邮箱地址除协议支持外还需要用户端软件配合,实践中成功率参差不齐,关键业务场景建议同时保留 ASCII 地址。