支持 Applications 中的国际化域名 (IDNA) 和 Unicode IDNA 兼容性处理。
此处提供的这些标准的最新版本提供了更全面的语言覆盖,并降低了允许已知存在安全漏洞的域名的可能性。该库可以很好地替代 Python 标准库中附带的 “encodings.idna” 模块,但该模块仅支持 2003 年的旧版已淘汰的 IDNA 规范。
基本函数的执行很简单:
>>> import idna
>>> idna.encode('ドメイン.テスト')
b'xn--eckwd4c7c.xn--zckzah'
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
ドメイン.テスト该包可通过典型的机制从 PyPI 安装,例如:
$ python3 -m pip install idna对于典型用法,encode 和 decode 函数接收一个域名作为参数,并分别执行转换为 ASCII 兼容编码(称为 A-label)或 Unicode 字符串(称为 U-label)的操作。
>>> import idna
>>> idna.encode('ドメイン.テスト')
b'xn--eckwd4c7c.xn--zckzah'
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
ドメイン.テスト如果需要,可以通过 ulabel 或 alabel 函数按标签进行转换:
>>> idna.alabel('测试')
b'xn--0zwm56d'该库支持 Unicode IDNA 兼容性处理,该处理在执行 IDNA 转换操作之前,会规范化用户可能输入的各种域名的输入。这种功能,称为 映射,在规范中被视为一个与 IDNA 转换功能不同的本地用户界面问题。
例如,“Königsgäßchen” 不是一个允许的标签,因为 拉丁大写字母 K 不被允许(一般来说,大写字母也不被允许)。 UTS 46 会在应用 IDNA 转换之前将其转换为小写。
>>> import idna
>>> idna.encode('Königsgäßchen')
...
idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
>>> idna.encode('Königsgäßchen', uts46=True)
b'xn--knigsgchen-b4a3dun'
>>> print(idna.decode('xn--knigsgchen-b4a3dun'))
königsgäßchen在按照规范进行转换期间引发的所有错误都应引发派生自 idna.IDNAError 基类的异常。
可能生成的更具体的异常包括 idna.IDNABidiError(当错误反映了标签中左右移动字符的非法组合时)、idna.InvalidCodepoint(当特定码点是 IDN 标签中的非法字符时,即 INVALID)以及 idna.InvalidCodepointContext(当码点由于其在字符串中的位置而非法时,即它是 CONTEXTO 或 CONTEXTJ,但上下文要求未满足)。
IDNA 和 UTS 46 的功能依赖于预先计算的查找表来实现性能。这些表是通过使用命令行脚本 tools/idna-data 对各自标准中的资格标准进行计算得出的。
此工具将从 Unicode 存储库获取相关的码点数据,并执行必要的计算以确定资格。有三种主要模式:
idna-data make-libdata。生成idnadata.py和uts46data.py,这是 IDNA 和 UTS 46 转换所使用的预先计算的查找表。希望将此库与不同 Unicode 版本进行对标的实现者可以使用此工具手动生成不同版本的idnadata.py和uts46data.py文件。idna-data make-table。以 RFC 5892 B.1 附录和 IANA 发布的预计算表中的格式生成 IDNA 处置(例如 PVALID、CONTEXTJ、CONTEXTO)的表。idna-data U+0061。打印关于单个 Unicode 码点(本例中为 U+0061)的各种属性的调试输出,这些属性用于评估码点的 IDNA 和 UTS 46 状态。这对于调试或分析很有帮助。
该工具接受多个参数,可通过 idna-data -h 进行描述。最值得注意的是,--version 参数允许指定用于计算表数据的 Unicode 版本。例如,idna-data --version 9.0.0 make-libdata 将针对 Unicode 9.0.0 生成库数据。
- 包。最新的标记版本已发布在 Python Package Index。
- 版本支持。该库支持 Python 3.8 及更高版本。 由于该库是各种应用程序的底层工具包,其中许多应用程序致力于与旧版 Python 保持广泛兼容,因此没有急于移除对旧解释器的支持。随着自动化测试无法轻松运行(即 Python 版本正式终止生命周期后),对旧版本的支持可能会从新版本中移除。
- 测试。该库有一个基于 IDNA 规范每个规则的测试套件,以及 Unicode 技术标准 46 Unicode IDNA 兼容性处理中提供的测试。
- 表情符号。有时会有支持表情符号域名的请求。IDNA 2008 技术标准明确禁止对表情符号等符号进行编码,并且由于相关的安全风险,表情符号域名在域名行业中已基本淘汰。目前,需要支持这些不符合规范的标签的应用程序可以考虑先尝试在此库中进行编码/解码操作,然后回退到使用 encodings.idna。有关更多讨论,请参阅 Github 项目。
- 过渡性处理。Unicode 16.0.0 移除了过渡性处理,因此 encode() 方法的 transitional 参数不再有效,将在稍后移除。