python:encodings.idna --- 应用程序中的国际化域名

python:encodings.idna --- 应用程序中的国际化域名


此模块实现了 RFC 3490 (应用程序中的国际化域名) 和 RFC 3492 (Nameprep: 用于国际化域名 (IDN) 的 Stringprep 配置文件)。 它是在 punycode 编码格式和 stringprep 的基础上构建的。

如果你需要来自 RFC 5891 和 RFC 5895 的 IDNA 2008 标准,请使用第三方 idna 模块。

这些 RFC 共同定义了一个在域名中支持非 ASCII 字符的协议。 一个包含非 ASCII 字符的域名 (例如 www.Alliancefrançaise.nu) 会被转换为兼容 ASCII 的编码格式 (简称 ACE,例如 www.xn–alliancefranaise-npb.nu)。 随后此域名的 ACE 形式可以用于所有由于特定协议而不允许使用任意字符的场合,例如 DNS 查询,HTTP Host 字段等等。 此转换是在应用中进行的;如有可能将对用户可见:应用应当透明地将 Unicode 域名标签转换为线上的 IDNA,并在 ACE 标签被呈现给用户之前将其转换回 Unicode。

Python 以多种方式支持这种转换: idna 编解码器执行 Unicode 和 ACE 之间的转换,基于在 section 3.1 of RFC 3490 中定义的分隔字符将输入字符串拆分为标签,再根据需要将每个标签转换为 ACE,相反地又会基于 . 分隔符将输入字节串拆分为标签,再将找到的任何 ACE 标签转换为 Unicode。 此外,socket 模块可透明地将 Unicode 主机名转换为 ACE,以便应用在将它们传给 socket 模块时无须自行转换主机名。 除此之外,许多包含以主机名作为函数参数的模块例如 http.client 和 ftplib 都接受 Unicode 主机名(并且 http.client 也会在 Host 字段中透明地发送 IDNA 主机名,如果它需要发送该字段的话)。

当从线路接收主机名时(例如反向名称查找),到 Unicode 的转换不会自动被执行:希望向用户提供此种主机名的应用应当将它们解码为 Unicode。

encodings.idna 模块还实现了 nameprep 过程,该过程会对主机名执行特定的规范化操作,以实现国际域名的大小写不敏感特性与合并相似的字符。 如果有需要可以直接使用 nameprep 函数。

encodings.idna.nameprep(label)
返回 label 经过名称处理操作的版本。 该实现目前基于查询字符串,因此 AllowUnassigned 为真值。

encodings.idna.ToASCII(label)
将标签转换为 ASCII,规则定义见 RFC 3490。 UseSTD3ASCIIRules 预设为假值。

encodings.idna.ToUnicode(label)
将标签转换为 Unicode,规则定义见 RFC 3490。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个天秤座的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值