質問

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

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

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

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

編集:

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

役に立ちましたか?

解決

Unicode文字列のdecodeメソッドには、実際にはまったくアプリケーションがありません(何らかの理由でUnicode文字列に非テキストデータがある場合を除きます-以下を参照)。主に歴史的な理由でそこにあると思います。 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()の場合は逆です-デフォルトのエンコーディングでbyteの暗黙的なデコードを試みます:

>>> 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)

このように使用すると、stringも不要になります。

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

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

しかし、あなたは正しい:<!> quot; encoding <!> quot;のあいまいな使用法。これらの両方のアプリケーションは... awkardです。繰り返しになりますが、Python 3で<=>と<=>の型が分離されているため、これは問題ではなくなりました。

他のヒント

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' codec can't encode characters in position 0-5: 
    ordinal not in range(128)

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

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

例:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so
   >>> 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では正しくありません。

いくつかの良いリンク:

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

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


その他の説明:

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

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

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

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

mybytestring.encode(somecodec)は、これらのsomecodec

の値に対して意味があります。
  • base64
  • bz2
  • zlib
  • hex
  • quopri
  • rot13
  • string_escape
  • uu

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

Python UnicodeDecodeError-エンコードを誤解していますかをお読みください。 PythonでのUnicodeの理解は、受け入れられた回答を読んだ後、より明確になりました。

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

編集:

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

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

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

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

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

たとえば、「\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87」は2つの漢字の表現ですが、コンピューターは(その中国語の単語を探します。この場合、<!> quot; utf-8 <!> quot;異なるまたは間違った辞書を(異なるデコード方法を使用して)見た場合、意図した中国語の単語を正しく表示できません。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top