在浏览器地址栏输入中文域名,类似“中文.com”,页面展示的是汉字。但电脑发给DNS的查询请求,里面并不是汉字,而是一串以“xn--”开头的字母数字串。这串编码叫punycode,才是DNS系统识别的真实域名。中文域名只是展示给人阅读的表层外壳。
DNS系统诞生之初,只支持英文字母、数字和连字符。汉字、日文、阿拉伯文字符,它完全无法识别。后续互联网向多语言扩展,推出国际化域名标准,缩写IDN。这套标准核心作用就一件事:把非ASCII字符,转换成DNS能够处理的ASCII字符串,转换输出结果就是punycode。

转换逻辑不是拼音。很多人误以为“中文.com”会转成zhongwen.com,并不是。拼音是输入法层面的处理,和DNS编码没有任何关联。“中文.com”和“zhongwen.com”属于两个完全独立域名,互不相关。
实际转换流程是这样。系统先提取“中文”二字的Unicode码点,“中”码点U+4E2D,“文”码点U+6587。punycode算法按照固定规则,将这些码点编码成字母数字组合,再在最前面添加“xn--”前缀,用来告诉解析器,后续字符串是punycode编码,不是普通ASCII字符。所以“中文.com”转换之后得到“xn--fiq228c.com”。
你可以自行验证。浏览器地址栏输入“中文.com”,打开网页之后复制地址,有时候就能看到xn--fiq228c.com这串编码。也可以找在线punycode转换工具,输入中文域名,点击转换,返回的字符串就是提交给DNS的内容。
后缀如果是中文,同样会执行编码转换。“.中国”这个中文顶级域名,对应的punycode是xn--fiqs8s。完整域名“中文.中国”,编码后就是xn--fiq228c.xn--fiqs8s。浏览器展示“中文.中国”,DNS收到的是这串类似乱码的字符。
“.公司”对应xn--55qx5d,“.网络”对应xn--io0a7i,“.网址”对应xn--ses554g。这类中文后缀,在注册局数据库存储形式本身就是punycode。注册中文域名,注册局保存的记录同样是punycode。查询中文域名Whois信息,注册域名字段经常直接返回xn--开头字符串,不是汉字。
转换过程还附带规范化处理。全角字母、半角字母统一,大写字符转为小写,部分简体、繁体字在IDNA标准下会映射到同一编码。这类规则用来防止同一个中文域名生成多种punycode写法,避免解析混乱。不同浏览器、操作系统对中文域名规范化处理细节存在微小差别,主流产品都遵循IDNA标准,最终转换结果保持一致。
这套编码支持逆向解码。拿到xn--fiq228c.com,任何人使用punycode解码算法,都能还原回“中文.com”。它不属于加密,也不是隐私保护手段,只是专门适配域名场景的编码方案,和汉字转UTF-8再转十六进制的思路相近,只是punycode生成字符串更短,适配DNS传输需求。
普通用户不用手动执行编码转换。浏览器、邮件客户端、手机系统内置IDN处理模块。输入中文,系统自动转punycode发送;收到punycode编码,自动展示成中文。你唯一能留意到编码串的场景,复制链接、查看网页源代码,或是使用老旧网络工具查询域名,看到xn--开头地址。这不是乱码,就是中文域名在DNS系统里的真实形态。