【发布时间】:2012-03-21 13:54:13
【问题描述】:
我有一些无法解码的 IDNA 编码字符串。在 Python 中,我尝试u"xn--grohandel-shop-2fb".decode("idna") 并得到错误“IDNA 不往返”。 "xn--sottmqqo5-lgbe9b7no0hmz9u" 也是如此。
我被难住了,谷歌搜索错误一点帮助都没有。
【问题讨论】:
我有一些无法解码的 IDNA 编码字符串。在 Python 中,我尝试u"xn--grohandel-shop-2fb".decode("idna") 并得到错误“IDNA 不往返”。 "xn--sottmqqo5-lgbe9b7no0hmz9u" 也是如此。
我被难住了,谷歌搜索错误一点帮助都没有。
【问题讨论】:
错误“IDNA 不往返”表示模块在对字符串进行解码和编码时得到不同的结果。
通过查看 Python 的 IDNA 模块的 source code,如果模块无法重新创建输入,则会在第 139 行引发错误“IDNA 不往返”。在解码函数中,输入被点分割,每个部分都转换为toUnicode。那里的文本被解码,但在返回结果之前,它对结果进行编码并将其与输入进行比较,如果不同则引发错误:“它不往返”或encode(decode(text)) != text。
在错误消息中,您还获得了它尝试比较的两个字符串,在第一个示例中您获得:
UnicodeError: ('IDNA does not round-trip', 'xn--grohandel-shop-2fb', 'grosshandel-shop')
您收到错误是因为它已将“großhandel-shop”中的ß 转换为“grosshandel-shop”中的ss。 The ß character was added to the .de-tld late 2010,所以这是一个错误。改之前ß应该改成ss。
您的第二个示例可能已损坏,因为它转换为:“đsottĤmqĐqǗoĔ⢠5”
【讨论】: