问题是您的URL无法按照
IDNArules正确编码,该规则控制如何转换国际化域名:
域名的ASCII和非ASCII形式之间的转换是通过称为ToASCII和ToUnipre的算法完成的。这些算法不适用于整个域名,而是应用于单个标签。例如,
**如果域名为www.example.com,则标签为www,example和com。 ToASCII或ToUnipre 分别应用于这三个 。**这两种算法的细节很复杂,并且在RFC 3490中进行了指定。以下概述了它们的功能。
ToASCII保留任何ASCII标签不变, 但如果该标签不适用于域名系统 , 则会失败。
如果给定的标签至少包含一个非ASCII字符,则ToASCII将应用Nameprep算法,该算法会将标签转换为小写并执行其他归一化处理,然后在使用四个字符之前,先使用Punypre
[16]将结果转换为ASCII。字符串“ xn-”。[17]
这四个字符的字符串称为ASCII兼容编码(ACE)前缀,用于区分Punypre编码的标签和普通的ASCII标签。ToASCII算法可能会以多种方式失败。例如,最终字符串可能超过DNS名称的63个字符的限制。ToASCII失败的标签不能在国际化域名中使用。
在您的情况下,“(空白)”不是有效的域名字符,您最终得到以下结果:
>>> '.f.de'.enpre('idna')Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.6/encodings/idna.py", line 164, in enpre result.append(ToASCIi(label)) File "/usr/lib/python2.6/encodings/idna.py", line 73, in ToASCII raise UnipreError("label empty or too long")UnipreError: label empty or too long如果将域名更改为“ afde”,则不应引发此异常。



