184

str/unicode のデコードとエンコードの違いを理解していると確信したことは一度もありません。

str().decode()Unicode 文字列を返すエンコーディング名を指定すると、特定の文字エンコーディングがあることがわかっているバイト文字列がある場合に使用されることを私は知っています。

unicode().encode()指定されたエンコーディング名に従って、ユニコード文字をバイト文字列に変換することを知っています。

しかし、私は何のためにあるのか理解できませstr().encode()unicode().decode()。上記で私が間違っていたことを誰かが説明し、おそらく修正することはできますか?

編集:

いくつかの回答は、文字列で何をするかについての情報を提供しますが、ユニコードで.encode何をするかは誰も知りません。.decode

4

6 に答える 6

106

Unicode 文字列のdecodeメソッドには、実際にはまったく用途がありません (何らかの理由で Unicode 文字列に非テキスト データが含まれている場合を除きます。以下を参照してください)。主に歴史的な理由からそこにあると思います。Python 3 では完全になくなりました。

unicode().decode()デフォルト (ascii) コーデックを使用して暗黙のエンコードを実行します。sこれを次のように確認します。

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

エラーメッセージはまったく同じです。

それは逆なので、デフォルトのエンコーディングを使用しての暗黙的なデコードstr().encode()試みます。s

>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)

このように使用するのstr().encode()も余計です。

しかし、後者の方法の便利な別のアプリケーションがあります。文字セットとは関係なく、意味のある方法で 8 ビット文字列に適用できるエンコーディングがあります。

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

しかし、あなたの言うとおりです。これら両方のアプリケーションの「エンコード」のあいまいな使用法は... 厄介です。繰り返しますが、Python 3 の別のタイプbytestringタイプでは、これはもはや問題ではありません。

于 2009-01-16T02:06:33.917 に答える
70

Unicode 文字列をバイトの文字列として表現することは、エンコーディングと呼ばれます。を使用しu'...'.encode(encoding)ます。

例:

    >>> u'æøå'.encode('utf8')
    '\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5'
    >>> u'æøå'.encode('latin1')
    '\xc3\xa6\xc3\xb8\xc3\xa5'
    >>> u'æøå'.encode('ascii')
    UnicodeEncodeError: 'ascii' コーデックは位置 0-5 の文字をエンコードできません:
    序数が範囲外(128)

通常、IO に使用する必要があるときはいつでも Unicode 文字列をエンコードします。たとえば、ネットワーク経由で転送したり、ディスク ファイルに保存したりします。

バイト文字列を Unicode 文字列に変換することは、デコードと呼ばれます。unicode('...', encoding)or '...'.decode(encoding)を使用します。

例:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # インタープリターは Unicode オブジェクトを次のように出力します
   >>> ユニコード ('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'
   >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'

通常、ネットワークまたはディスク ファイルから文字列データを受信するたびに、バイト文字列をデコードします。

Python 3 では Unicode の処理にいくつかの変更があると思われるため、上記はおそらく Python 3 では正しくありません。

いくつかの良いリンク:

于 2009-01-15T20:41:48.377 に答える
16

anUnicode。encode('encoding')は文字列オブジェクトになり、Unicodeオブジェクトで呼び出すことができます

文字列。デコード(「エンコーディング」)はUnicodeオブジェクトになり、指定されたエンコーディングでエンコードされた文字列で呼び出すことができます。


さらにいくつかの説明:

エンコーディングが設定されていないUnicodeオブジェクトを作成できます。Pythonによってメモリに保存される方法はあなたの関心事ではありません。検索して分割し、任意の文字列操作関数を呼び出すことができます。

しかし、Unicodeオブジェクトをコンソールまたはテキストファイルに印刷したいときが来ます。したがって、エンコードする必要があり(たとえば、UTF-8では)、encode('utf-8')を呼び出すと、内部に'\ u <someNumber>'が含まれる文字列が取得され、完全に印刷可能になります。

次に、もう一度-逆のことをしたい-UTF-8でエンコードされた文字列を読み取り、それをUnicodeとして扱うので、\ u360は5ではなく1文字になります。次に、文字列を(選択されたエンコードで)デコードし、 Unicodeタイプの新しいオブジェクトを取得します。

補足として、「zip」、「base64」、「rot」などの変質エンコーディングを選択でき、それらの一部は文字列から文字列に変換されますが、最も一般的なケースはUTF-8を含むケースだと思います/UTF-16と文字列。

于 2009-01-16T23:11:40.193 に答える
12

mybytestring.encode(somecodec) は、次の値に対して意味がありますsomecodec:

  • base64
  • bz2
  • zlib
  • 六角
  • クオプリ
  • rot13
  • string_escape
  • うーん

既にデコードされた Unicode テキストのデコードが何に適しているのかわかりません。任意のエンコーディングでそれを試みると、常に最初にシステムのデフォルトのエンコーディングでエンコードしようとするようです。

于 2009-01-15T16:15:39.677 に答える
5

str から str へ、または unicode から unicode へのデコード/エンコードに使用できるエンコーディングがいくつかあります。たとえば、base64、hex、rot13 などです。それらはcodecs モジュールにリストされています。

編集:

Unicode 文字列のデコード メッセージは、対応するエンコード操作を元に戻すことができます。

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

返される型は、残念ながら unicode ではなく str です。しかし、str と unicode の間で適切なエンコード/デコードを行っていない場合、とにかく混乱しているように見えます。

于 2009-01-15T15:20:41.053 に答える