2012-03-21 57 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