2012-03-21 54 views
3

我有一些IDNA编码的字符串,我无法解码。在Python中,我尝试u"xn--grohandel-shop-2fb".decode("idna")并得到错误“IDNA不往返”。 "xn--sottmqqo5-lgbe9b7no0hmz9u"相同。IDNA不会往返

我很难过,并且用Google搜索错误根本没有帮助。

回答

4

错误“IDNA不会往返”意味着模块在对字符串进行解码和编码时会得到不同的结果。

通过查看针对Python的IDNA模块的source code,如果模块无法重新创建输入,则错误“IDNA不会往返”会在行139上引发。在解码功能中,输入按点分割,每个零件在toUnicode中转换。在那里文本被解码,但是在返回结果之前,它会对结果进行编码并将其与输入进行比较,如果不相同则引发错误:“它不会往返”或encode(decode(text)) != text

在错误消息也得到了两个字符串,它试图来比较,在第一个例子,你可以:

UnicodeError: ('IDNA does not round-trip', 'xn--grohandel-shop-2fb', 'grosshandel-shop') 

你得到的错误,因为它已转化的“GROSSHANDEL店” ß到“grosshandel-shop”中的ssThe ß character was added to the .de-tld late 2010,所以这是一个错误。在更改ß之前应该更改为ss

你的第二个例子是可能已损坏,因为它转换为:“đsottĤmqĐqǗoĔ⢠5”

+0

XN - grohandel店-2FB已经由2008年IDNA(这是正确的德国/ DENIC因为同时被正确编码)。你的Python很可能试图使用旧的IDNA 2003来解码它,它不知道'ß'。 请参阅https://www.denic.de/en/know-how/idn-domains/ – rockdaboot 2017-01-23 14:56:28

+0

我已创建错误报告:https://bugs.python.org/issue32437 – socketpair 2017-12-28 08:49:17