应用中的国际化域名 (IDNA)
项目描述
支持RFC 5891中指定的应用程序中的国际化域名 (IDNA) 协议。这是协议的最新版本,有时称为“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
用法
对于典型用法,encode和decode函数将采用域名参数并分别执行到 A-labels 或 U-labels 的转换。
>>> import idna
>>> idna.encode('ドメイン.テスト')
b'xn--eckwd4c7c.xn--zckzah'
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
ドメイン.テスト
您可以使用 idna.codec模块使用编解码器编码和解码方法:
>>> import idna.codec
>>> print('домен.испытание'.encode('idna'))
b'xn--d1acufc.xn--80akhbyknj4f'
>>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna'))
домен.испытание
如有必要,可以使用ulabel或 alabel函数在每个标签的基础上应用转换:
>>> idna.alabel('测试')
b'xn--0zwm56d'
兼容性映射 (UTS #46)
如RFC 5895中所述,IDNA 规范不规范来自用户可能输入域名的不同潜在方式的输入。此功能称为“映射”,规范认为是与 IDNA 转换功能不同的本地用户界面问题。
这个库提供了一个这样的映射,它是由 Unicode Consortium 开发的。它被称为Unicode IDNA 兼容性处理,它为典型应用程序提供常规映射,以及帮助从旧 IDNA 2003 应用程序迁移的过渡映射。
例如,“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 规范中,拉丁小写字母 SHARP S (ß) 被转换为两个拉丁小写字母 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 ;idna.InvalidCodepoint当特定代码点是 IDN 标签中的非法字符时(即 INVALID);和idna.InvalidCodepointContext当代码点基于其位置上下文非法时(即它是 CONTEXTO 或 CONTEXTJ 但不满足上下文要求。)
构建和诊断
IDNA 和 UTS 46 功能依赖于预先计算的查找表来提高性能。这些表格是根据相应标准中的资格标准计算得出的。这些表是使用命令行脚本tools/idna-data 计算的。
该工具将从 Unicode 存储库中获取相关的代码点数据,并执行所需的计算以识别资格。主要有以下三种模式:
idna 数据 make-libdata。生成idnadata.py和 uts46data.py,这是用于 IDNA 和 UTS 46 转换的预先计算的查找表。希望针对不同 Unicode 版本跟踪此库的实施者可以使用此工具手动生成不同版本的idnadata.py和uts46data.py文件。
idna 数据 生成表。以 RFC 5892 的附录 B.1 和IANA发布的预计算表中的格式生成 IDNA 处置表(例如 PVALID、CONTEXTJ、CONTEXTO)。
idna 数据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.5 及更高版本。由于该库作为各种应用程序的低级工具包,其中许多都力求与较旧的 Python 版本广泛兼容,因此无需急于删除较旧的解释器支持。删除对旧版本的支持应该是合理的,因为维护负担已经变得太高了。
蟒蛇 2。该库的 2.x 版本支持 Python 2。虽然 2.x 系列的积极开发已经结束,但正在纠正的显着问题可能会向后移植到 2.x。如果您需要此库用于 Python 2 应用程序,请在您的需求文件中使用“idna<3”。
测试。该库有一个基于 IDNA 规范的每个规则的测试套件,以及作为 Unicode 技术标准 46 的一部分提供的测试,Unicode IDNA 兼容性处理。
表情符号。在这个库中支持表情符号域是偶尔的请求。技术标准 IDNA 2008 明确禁止对 emoji 等符号进行编码,并且由于相关的安全风险,emoji 域在整个域行业被广泛淘汰。目前,希望支持这些不兼容标签的应用程序可能希望考虑先尝试此库中的编码/解码操作,然后再回退到使用encodings.idna。有关更多讨论,请参阅Github 项目。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。