1

ユーザー指定の文字列をUTF-8に変換する簡単な方法を探しています。非常にスマートである必要はありません。すべてのASCIIバイト文字列とすべてのUnicode文字列(2.x unicode、3.x str)を処理する必要があります。

unicode3.xで廃止されて意味が変わったので、メソッドの存在をチェックし、引数なしでそれを呼び出して、チェックを行う代わりに、ロケールに基づいてPythonに何をすべきかを理解させるstrのが良い考えだと思いました。それはまったく良い考えではないことがわかりました:decodeisinstance

>>> u"één"
u'\xe9\xe9n'
>>> u"één".decode()
Traceback (most recent call last):
  File "<ipython-input-36-85c1b388bd1b>", line 1, in <module>
    u"één".decode()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

私の質問は2つあります。

  1. なぜunicode.decode方法があるのですか?Unicode文字列は「エンコードされていない」と見なされていると思いました。これは、二重にエンコードされた文字列を取得する確実な方法のように見えます。
  2. Python 3と上位互換性のある方法でこの問題に取り組むにはどうすればよいですか?
4

3 に答える 3

5

Unicode文字列の「デコード」について話すのは役に立ちません。あなたはそれをバイトにコード化したいと思います。unicode.decode歴史的な理由だけでそこにあります。そのセマンティクスは無意味です。そのため、Python3では削除されました。

ただしencode/decodeセマンティクスは歴史的に拡張され、(文字)文字列から文字列またはバイトからバイトのエンコーディング(rot13やbzip2など)が含まれるようになりました。Python 3.1では、これらの疑似エンコーディングが削除され、Python3.2で再導入されました

一般に、文字列またはバイト文字列を受け入れるようにインターフェイスを設計する必要があります。(下位互換性以外の理由で)両方を受け入れるインターフェースは、コードの臭いであり、テストが難しく、バグが発生しやすく(誰かがUTF-16バイトを渡した場合はどうなりますか?)、そもそも疑わしいセマンティクスを持っています。

文字列とバイト文字列の両方を受け入れるインターフェイスが必要な場合はdecode、Python 3でメソッドが存在するかどうかを確認できます。コードを2.xでも機能させる場合は、を使用する必要がありますisinstance

于 2012-07-21T13:14:17.883 に答える
1

strとunicodeの間の変換は、エンコード/デコードの唯一の目的ではありません。コーデックもあります。

例(Python 2の場合):

>>> u'123'.encode('hex')
'313233'
>>> '313233'.decode('hex')
'123'
>>> u'313233'.decode('hex')
'123'

私はPython3に精通していないため、Python3でこれが機能するかどうかを判断できません。

于 2012-07-21T13:26:22.620 に答える
1
  1. Unicodeオブジェクトにはdecode()メソッドがあります。これは、basestringから継承し、basestringには1つあるため、Unicdodeにも1つ必要です。

  2. Python2またはPython3では、Unicode文字列をデコードしないことで問題に取り組みます。ご存知のように、そうすることは意味がありません。だからしないでください。

では、Python2とPython3の互換性のある待機でこれをどのように処理しますか?ええと、バイナリデータに文字列を使用するのではなく、を使用しますbytes。Pythonのすべてのバージョンで機能するdecode()メソッドがあります。

詳細については、 http: //python3porting.com/noconv.htmlおよびhttp://regebro.wordpress.com/2011/03/23/unconfusing-unicode-what-is-unicode/を参照してください。

于 2012-07-21T17:38:19.260 に答える