web-dev-qa-db-ja.com

エンコード/デコードの違いは何ですか?

Str/unicodeデコードとエンコードの違いを理解しているとは確信できませんでした。

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

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

しかし、str().encode()unicode().decode()の目的がわかりません。誰でも説明できますか、おそらく上で間違っている他の何かを修正することもできますか?

編集:

いくつかの答えは、文字列で.encodeが何をするかに関する情報を提供しますが、誰も.decodeがUnicodeで何をするかを知らないようです。

172
ʞɔıu

ユニコード文字列のdecodeメソッドには、実際にはまったくアプリケーションがありません(何らかの理由でユニコード文字列にテキスト以外のデータがある場合を除きます-以下を参照)。主に歴史的な理由でそこにあると思います。 Python 3では完全になくなりました。

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

>>> 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の暗黙的なdecodingを試みます。

>>> 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()も不要になります。

しかし、後者の方法の別の用途があります: encodings は文字セットとは関係ありませんが、したがって、8ビット文字列に意味のある方法で適用できます。

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

ただし、これらのアプリケーションの両方での「エンコード」のあいまいな使用法は... awkardです。繰り返しますが、Python 3にbytestringの型が分かれているので、これはもう問題ではありません。

103
user3850

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の位置の文字をエンコードできません:
 ordinal not not range(128)

ユニコード文字列は、通常、IOに使用する必要がある場合(たとえば、ネットワーク経由で転送する場合、またはディスクファイルに保存する場合)にエンコードします。

バイトの文字列をUnicode文字列に変換することを 解読unicode('...', encoding)または '...'。decode(encoding)を使用します。

例:

 >>>u'æøå '
 u'\xc3\xa6\xc3\xb8\xc3\xa5 '#インタープリターはUnicodeオブジェクトを次のように出力します。
 >>> 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については上記はおそらく正しくありません。

いくつかの良いリンク:

69
codeape

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

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


さらにいくつかの説明:

エンコードセットのないUnicodeオブジェクトを作成できます。 Pythonによってメモリに保存される方法は、心配する必要はありません。それを検索し、分割し、好きな文字列操作関数を呼び出すことができます。

ただし、Unicodeオブジェクトをコンソールまたはテキストファイルに出力する場合があります。したがって、encodeする必要があります(たとえば-UTF-8の場合)、encode( 'utf-8')を呼び出して、文字列を取得します完全に印刷可能な「\ u <someNumber>」。

その後、再び-あなたは反対をしたい-UTF-8でエンコードされた文字列を読み取ってUnicodeとして扱うので、\ u360は5ではなく1文字になります。その後、あなた decode文字列(選択したエンコーディング)を使用して、Unicodeタイプの新しいオブジェクトを取得します。

サイドノートとして-あなたは「Zip」、「base64」、「rot」のようないくつかの異常なエンコーディングを選択でき、それらのいくつかは文字列から文字列に変換しますが、最も一般的なケースはUTF-8を含むものだと思います/ UTF-16および文字列。

15
Abgan

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

  • base64
  • bz2
  • zlib
  • hex
  • クオプリ
  • rot13
  • string_escape
  • うう

すでにデコードされたユニコードテキストをデコードすることが何に役立つのかわかりません。任意のエンコーディングでこれを試みると、常に最初にシステムのデフォルトのエンコーディングでエンコードしようとするようです。

12
nosklo

Python UnicodeDecodeError-エンコードを誤解していますか と読む必要があります。 Pythonでのユニコードの理解は、受け入れられた答えを読んだ後、より明確になりました。

8
Oli

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

編集:

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

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

返される型は、ユニコードではなくstrであり、これは私の意見では残念です。しかし、strとunicodeの間で適切なen-/decodeを実行していないときは、とにかく混乱のように見えます。

5
unbeknown

簡単な答えは、それらは互いに正反対だということです。

コンピュータはバイトの非常に基本的な単位を使用して情報を保存および処理しますが、人間の目には意味がありません。

たとえば、 '\ xe4\xb8\xad\xe6\x96\x87'は2つの漢字の表現ですが、コンピューターはそれを探すための辞書が与えられたとき、それが漢字であること(印刷または保存を意味する)のみを知っていますこの場合、中国語の単語は「utf-8」辞書であり、異なるまたは間違った辞書を(異なるデコード方法を使用して)調べた場合、意図した中国語の単語を正しく表示できません。

上記の場合、コンピューターが中国語の単語を探すプロセスはdecode()です。

そして、中国語をコンピューターのメモリーに書き込むコンピューターのプロセスは、encode()です。

したがって、エンコード情報は生のバイトであり、デコードされた情報は生のバイトと参照する辞書の名前です(ただし、辞書自体ではありません)。

0
Eren Bay