一、命令概述
idn
是 Linux 系统中用于处理 国际化域名 (Internationalized Domain Names, IDN) 的工具,主要功能包括:
- 将 Unicode 字符串转换为 ASCII 格式 (ACE)。
- 将 ASCII 格式 (ACE) 转换回 Unicode 字符串。
- 支持 Punycode 编码/解码。
- 字符串预处理 (stringprep) 和 Unicode 规范化。
核心用途
- 处理包含非 ASCII 字符的域名(如中文、日文等)。
- 在 DNS 系统中兼容 ASCII 格式的域名解析。
- 开发或测试国际化域名相关功能。
二、基本语法
idn [OPTION]... [STRINGS]...
参数说明:
[OPTION]
:可选参数(如-a
,-u
,-d
,-e
等)。[STRINGS]
:待处理的字符串列表(默认从标准输入读取)。
三、常用选项详解
选项 | 说明 | 示例 |
---|---|---|
-h , --help | 显示帮助信息并退出。 | idn --help |
-V , --version | 显示版本信息并退出。 | idn --version |
-s , --stringprep | 按照 nameprep 预处理规范处理字符串。 | idn -s "example@domain" |
-d , --punycode-decode | 解码 Punycode 字符串。 | idn -d "xn--exmple-qla" |
-e , --punycode-encode | 编码为 Punycode。 | idn -e "例子.com" |
-a , --idna-to-ascii | 将 Unicode 字符串转换为 ACE 格式(默认模式)。 | idn -a "例子.com" |
-u , --idna-to-unicode | 将 ACE 格式转换回 Unicode 字符串。 | idn -u "xn--exmple-qla" |
--allow-unassigned | 启用 IDNA 的 AllowUnassigned 标志(默认关闭)。 | idn -a --allow-unassigned "test-123" |
--usestd3asciirules | 启用 IDNA 的 UseSTD3ASCIIRules 标志(默认关闭)。 | idn -a --usestd3asciirules "test" |
--no-tld | 忽略顶级域名 (TLD) 特定规则(仅适用于 --idna-to-ascii 和 --idna-to-unicode )。 | idn -a --no-tld "example.org" |
-n , --nfkc | 按照 Unicode v3.2 NFKC 规范化字符串。 | idn -n "例子.com" |
-p , --profile=STRING | 使用指定的字符串预处理配置文件(支持 Nameprep , iSCSI , Nodeprep , Resourceprep , trace , SASLprep )。 | idn -p "Nameprep" "example" |
--debug | 显示调试信息。 | idn --debug -a "例子.com" |
--quiet | 静默模式(仅输出结果,无额外信息)。 | idn --quiet -a "例子.com" |
四、核心功能详解
1. Unicode 到 ACE 转换(IDNA)
idn -a "例子.com"
- 效果:将 Unicode 字符串
例子.com
转换为 ASCII 格式(如xn--exmple-qla.com
)。 - 用途:在 DNS 系统中使用非 ASCII 域名。
2. ACE 到 Unicode 转换(IDNA)
idn -u "xn--exmple-qla.com"
- 效果:将 ASCII 格式的 ACE 域名转换回 Unicode 字符串(如
例子.com
)。 - 用途:解析或显示非 ASCII 域名。
3. Punycode 编码
idn -e "例子.com"
- 效果:将 Unicode 字符串
例子.com
编码为 Punycode 格式(如xn--exmple-qla
)。 - 用途:生成符合 Punycode 标准的编码字符串。
4. Punycode 解码
idn -d "xn--exmple-qla"
- 效果:将 Punycode 字符串
xn--exmple-qla
解码为 Unicode 字符串(如例子
)。 - 用途:解析 Punycode 编码的域名。
5. 字符串预处理(Stringprep)
idn -s "example@domain"
- 效果:按
nameprep
配置文件处理字符串(如规范化、去除无效字符)。 - 用途:预处理字符串以符合特定协议(如 XMPP、SASL)的要求。
6. Unicode 规范化(NFKC)
idn -n "例子.com"
- 效果:按 Unicode v3.2 NFKC 标准规范化字符串。
- 用途:确保字符串在不同系统中的一致性。
五、实际应用示例
示例 1:将中文域名转换为 ACE 格式
idn -a "例子.com"
- 输出:
xn--exmple-qla.com
示例 2:将 ACE 格式转换回中文域名
idn -u "xn--exmple-qla.com"
- 输出:
例子.com
示例 3:Punycode 编码与解码
# 编码
idn -e "例子"
# 输出: xn--exmple-qla
# 解码
idn -d "xn--exmple-qla"
# 输出: 例子
示例 4:启用 AllowUnassigned
标志
idn -a --allow-unassigned "test-123"
- 用途:允许未分配的 Unicode 字符通过转换。
示例 5:使用 SASLprep
预处理
idn -p "SASLprep" "example@domain"
- 用途:按 SASLprep 配置文件处理字符串(用于安全认证协议)。
六、注意事项
-
字符编码要求:
- 输入字符串默认使用当前 locale 的字符集(可通过
--debug
查看)。 - 可通过环境变量
CHARSET
覆盖默认字符集。
- 输入字符串默认使用当前 locale 的字符集(可通过
-
特殊字符处理:
- 若字符串以
-
开头(如-foo
),需使用--
分隔参数:idn --quiet -a -- -foo
- 若字符串以
-
调试信息:
- 使用
--debug
查看详细的字符集、转换规则和中间结果。
- 使用
-
兼容性:
- 不同版本的
idn
可能支持的预处理配置文件略有差异。
- 不同版本的
七、常见问题解答
Q1: idn
和 idna
有什么区别?
- 区别:
idn
是 GNU 实现的命令行工具,支持多种预处理配置文件。idna
是其他实现的工具(如libidn2
提供的idn2
命令)。
Q2: 如何处理中文域名?
- 方法:
idn -a "中文域名.com"
- 输出为 ASCII 格式的 ACE 域名(如
xn--exmple-qla.com
)。
- 输出为 ASCII 格式的 ACE 域名(如
Q3: Punycode 是什么?
- 定义:
- Punycode 是一种将 Unicode 字符串编码为 ASCII 字符串的算法,用于国际化域名的转换。
Q4: 如何查看默认字符集?
- 方法:
idn --debug
- 输出中会包含当前 locale 的字符集信息。
八、总结表格:常用命令用途一览
命令 | 功能 | 备注 |
---|---|---|
idn -a "例子.com" | 将 Unicode 转换为 ACE 格式 | 默认模式 |
idn -u "xn--exmple-qla.com" | 将 ACE 转换回 Unicode | 用于解析域名 |
idn -e "例子" | 编码为 Punycode | 生成 Punycode 字符串 |
idn -d "xn--exmple-qla" | 解码 Punycode | 解析 Punycode 字符串 |
idn -s "example@domain" | 字符串预处理 | 适用于 XMPP/SASL 等协议 |
idn -n "例子.com" | Unicode 规范化 | 确保字符串一致性 |