2012-03-21 8 views
3

デコードできないIDNAでエンコードされた文字列があります。 Pythonでは、私はu"xn--grohandel-shop-2fb".decode("idna")を試して、 "IDNAは往復しません"というエラーを受け取ります。 "xn--sottmqqo5-lgbe9b7no0hmz9u"と同じです。IDNAは往復しません

私は困惑しており、エラーのグーグルリングはまったく役に立たない。

答えて

4

"IDNAはラウンドトリップしません"というエラーは、文字列をデコードしてエンコードする際にモジュールが異なる結果を取得することを意味します。

PythonのIDNAモジュール用にsource codeを見ると、モジュールが入力を再作成できない場合、エラー "IDNA does not round-trip"が139行目に生成されます。デコード機能では、入力はドットで分割され、すべての部分はtoUnicodeに変換されます。テキストはデコードされますが、結果が返される前に結果がエンコードされ、入力と比較され、同じでない場合はエラーが発生します: "往復しません"またはencode(decode(text)) != text

あなたも最初の例ではあなたが得る、それは比較しようとした2つの文字列を取得し、エラーメッセージで

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は正しくしばらく以来、ドイツ/ DENICに正しいIDNA 2008(によって符号化されています)。あなたのPythonは、 'ß'を知らない古いIDNA 2003を使ってそれを解読しようとするでしょう。 https://www.denic.de/en/know-how/idn-domains/ – rockdaboot

+0

私はバグレポートを作成しました:https://bugs.python.org/issue32437 – socketpair

関連する問題