跳转到主要内容

应用程序中的国际化域名 (IDNA)

项目描述

支持应用程序中的国际化域名 (IDNA) 协议,该协议在 RFC 5891 中指定。这是该协议的最新版本,有时被称为“IDNA 2008”。

此库还提供了对 Unicode 技术标准 46,Unicode IDNA 兼容处理 的支持。

这可以作为 Python 标准库中的“encodings.idna”模块的合适替代品,但后者只支持较旧的已废弃的 IDNA 规范(《RFC 3490》)。

基本功能简单执行

>>> import idna
>>> idna.encode('ドメイン.テスト')
b'xn--eckwd4c7c.xn--zckzah'
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
ドメイン.テスト

安装

此软件包可以从 PyPI 进行安装

$ python3 -m pip install idna

使用方法

对于典型使用,encodedecode函数将接受一个域名参数,并分别执行转换为A标签或U标签。

>>> import idna
>>> idna.encode('ドメイン.テスト')
b'xn--eckwd4c7c.xn--zckzah'
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
ドメイン.テスト

您可以使用idna.codec模块中的编解码器编解码方法。

>>> import idna.codec
>>> print('домен.испытание'.encode('idna2008'))
b'xn--d1acufc.xn--80akhbyknj4f'
>>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008'))
домен.испытание

如果需要,可以使用ulabelalabel函数在标签级别应用转换。

>>> idna.alabel('测试')
b'xn--0zwm56d'

兼容性映射(UTS #46)

RFC 5895中所述,IDNA规范不标准化来自用户可能输入域名不同潜在方式的输入。这种功能,称为“映射”,根据规范被认为是与IDNA转换功能不同的本地用户界面问题。

此库提供了一个由Unicode联盟开发的此类映射。称为Unicode IDNA兼容性处理,它为典型应用程序提供了常规映射,以及过渡映射,以帮助从旧的IDNA 2003应用程序迁移。在执行IDNA操作之前,根据第4.4节“IDNA2008预处理”对字符串进行预处理。

例如,“Königsgäßchen”不是一个允许的标签,因为不允许使用LATIN CAPITAL LETTER 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

过渡处理提供了转换,有助于从较旧的2003标准过渡到当前标准。例如,在原始IDNA规范中,LATIN SMALL LETTER SHARP S(ß)被转换为两个LATIN SMALL LETTER S(ss),而在当前IDNA规范中,这种转换不被执行。

>>> idna.encode('Königsgäßchen', uts46=True, transitional=True)
'xn--knigsgsschen-lcb0w'

实现者应谨慎使用过渡处理,仅在极少数情况下需要从旧标签转换为当前标签时(即2008年之前的IDNA实现)才使用。对于只需要转换标签的典型应用程序,过渡处理可能不会带来好处,并可能导致意外的不兼容结果。

encodings.idna 兼容性

Python内置的encodings.idna模块的函数调用使用idna.compat模块映射到其IDNA 2008等价物。只需替换代码中的import子句,以便引用新的模块名称。

异常

在转换过程中根据规范引发的错误应引发从idna.IDNAError基类派生的异常。

可能生成的更具体异常包括,当错误反映了标签中从左到右和从右到左字符的非法组合时,会生成idna.IDNABidiError;当特定代码点在IDN标签中是非法字符时(即INVALID),会生成idna.InvalidCodepoint;当代码点根据其位置上下文非法时(即它是CONTEXTO或CONTEXTJ,但上下文要求未满足),会生成idna.InvalidCodepointContext

构建和诊断

IDNA和UTS 46功能依赖于预先计算的查找表以提高性能。这些表是从计算各自标准中的资格标准中得出的。这些表使用命令行脚本tools/idna-data进行计算。

此工具将从Unicode存储库检索相关代码点数据并执行所需的计算以确定资格。有三个主要模式

  • idna-data make-libdata. 生成 idnadata.pyuts46data.py 文件,这些是用于 IDNA 和 UTS 46 转换的预计算查找表。希望跟踪不同 Unicode 版本库的实现者可以使用此工具手动生成不同版本的 idnadata.pyuts46data.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 包索引 上。

  • 版本支持。此库支持 Python 3.6 及以上版本。由于此库作为各种应用程序的低级工具包,其中许多应用程序力求与较旧的 Python 版本广泛兼容,因此没有迫切需要移除旧解释器支持。移除旧版本的支持应该有充分的理由,因为维护负担已经变得过高。

  • Python 2。此库的 2.x 版本支持 Python 2。如果需要此库用于 Python 2 应用程序,请在需求文件中使用 “idna<3”。请注意,这些版本不再积极开发。

  • 测试。该库基于 IDNA 规范的每条规则有一个测试套件,以及 Unicode 技术标准 46 提供的测试,即 Unicode IDNA 兼容处理

  • 表情符号。偶尔有人要求在此库中支持表情符号域名。根据 IDNA 2008 技术标准,明确禁止了对诸如表情符号之类的符号进行编码,并且由于相关的安全风险,表情符号域名在整个域名行业中已逐步淘汰。目前,需要支持这些不符合规范标签的应用程序可能希望先尝试在此库中执行编码/解码操作,然后回退到使用 encodings.idna。有关更多信息,请参阅 GitHub 项目

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

idna-3.10.tar.gz (190.5 kB 查看散列值)

上传时间 源代码

构建分发

idna-3.10-py3-none-any.whl (70.4 kB 查看散列值)

上传时间 Python 3

支持者