宝塔拨测博客拨测技术博客
宝塔拨测

中文域名为什么打不开?Punycode 转码与 DNS 解析

中文域名打不开,问题多半不在域名本身,而在「转码」这个环节:DNS 只认识 ASCII,中文域名在解析前必须先按 Punycode 转成 xn– 开头的形式。如果转码结果和实际解析记录对不上,或用了不被标准解析服务器支持的中文后缀,就会出现「域名看着正常,却打不开」的情况。本文讲清这层转换逻辑,并用宝塔的 中文域名转码工具 实测双向互转。

Punycode 是什么:中文域名为什么不能直接写进 DNS

DNS 协议从设计上只处理 ASCII 字符,中文、日文、韩文这些非 ASCII 字符没法直接出现在域名解析记录里。国际化域名(IDN,Internationalized Domain Names)解决这个问题的办法是:先把 Unicode 域名按 Punycode 编码成只含 a-z、0-9 和连字符的 ASCII 字符串,再在每个标签前加 xn-- 前缀,交给 DNS 解析。

Punycode 是 RFC 3492 定义的编码算法,也是 IDNA(Internationalized Domain Names in Applications)标准采用的编码方式。所以一个中文域名在 DNS 里的「真身」其实是它的 Punycode 形式:

中文域名 Punycode(xn– 形式)
例子.测试 xn–fsqu00a.xn–0zwm56d
中国 xn–fiqs8s
百度.com xn–wxtr44c.com

上面的转码结果可以本机复现:用 Node.js 的 punycode 模块或 Python 的 idna 编码,例子.测试 → xn--fsqu00a.xn--0zwm56d、百度.com → xn--wxtr44c.com,与上表一致。

打不开的常见原因:转码错误和中文后缀

中文域名打不开,一般落在下面两种情形之一。

一是转码结果不一致。 注册商、DNS 服务商或你自己配解析时,如果哪一环没按 Punycode 正确转码,解析记录就存成了错误的形式。浏览器查询时用的是标准转码结果,两边对不上,自然解析失败。排查时先拿到正确的 xn– 形式,再和解析记录里的实际值比对。

二是用了不被直接支持的中文后缀。 「.中国」「.公司」「.网络」是 CNNIC 推出的中文顶级域名,但它们不被标准解析服务器直接支持,转码结果通常带 .cn 等价后缀。也就是说,这类中文后缀的域名实际解析时会落到对应的 .cn 域名上,配置和排查都要按转码后的真实形式来处理。

用宝塔中文域名转码工具双向互转

宝塔中文域名转码工具 解决的就是「中文域名和 xn– 形式互相转」这个需求:输入中文域名得到 Punycode,输入 xn– 形式则还原回中文,转换在浏览器本地完成,不会上传到服务器。

实测输入「例子.测试」,工具即时给出两个结果:

中文域名「例子.测试」转成 Punycode xn–fsqu00a.xn–0zwm56d 的结果

中文域名「例子.测试」转成 xn--fsqu00a.xn--0zwm56d,反向往输入框粘贴 xn--fsqu00a.xn--0zwm56d 也能还原回「例子.测试」——两个方向都与上面本机复现的结果一致。

有了这层转换关系,排查中文域名打不开就有了抓手:先转出正确的 xn– 形式,再把它和 DNS 解析记录、WHOIS 里的域名形态逐一比对,就能判断问题出在转码、后缀还是解析配置。

常见问题

中文域名为什么要转成 xn-- 开头的形式?

DNS 协议本身只处理 ASCII 字符,中文等非 ASCII 字符没法直接写进 DNS 记录。所以国际化域名(IDN)必须先把中文按 Punycode 编码成 a-z、0-9 组成的 ASCII 字符串,并在每个标签前加 xn-- 前缀,DNS 才能解析。浏览器和操作系统在查询前会自动完成这步转换。

Punycode 是什么?

Punycode 是 RFC 3492 定义的一种编码算法,用于把 Unicode 字符串转换成只用字母、数字和连字符组成的 ASCII 形式,是国际化域名(IDNA)标准采用的编码方式。转码后的域名每个中文标签前都会出现 xn-- 前缀,例如「例子.测试」转成 xn--fsqu00a.xn--0zwm56d。

中文域名打不开是域名坏了吗?

不一定。中文域名打不开常见是转码环节的问题:一是注册商或 DNS 服务商没正确按 Punycode 转码、导致解析记录存成了错误形式;二是「.中国」「.公司」「.网络」这类中文后缀不被标准解析服务器直接支持。域名本身没坏时,先核对转码结果是否与解析记录一致。

「.中国」「.公司」「.网络」后缀能用吗?

这几个是 CNNIC 推出的中文顶级域名后缀,但它们不被标准解析服务器直接支持,转码结果通常带 .cn 等价后缀。也就是说中文后缀的域名实际解析时可能落到对应的 .cn 域名上,配置解析和排查时要按转码后的真实形式核对。

怎么把中文域名和 xn-- 形式互相转?

用宝塔中文域名转码工具(t.bt.cn/tools/domain-punycode.html)输入中文域名或 xn-- 形式的域名,即可得到对应的双向结果,转换在浏览器本地完成、不会上传到服务器。例如输入「例子.测试」得到 xn--fsqu00a.xn--0zwm56d,反向输入也能还原回中文。

中文域名能直接 curl 或 ping 吗?

多数现代命令行工具会自动做 IDNA 转码,直接输入中文域名也能解析;但旧版工具或自定义脚本可能不识别中文,此时需要先手动转成 xn-- 形式再操作。拿不准时先用转码工具得到 ASCII 域名,再交给 curl、ping 或拨测工具。

中文域名PunycodeIDNxn--DNS宝塔拨测