16

encode私は自分自身とPythonで理解しようとしましdecodeたが、私にとって本当に明確なことは何もありません。

  1. str.encode([encoding,[errors]])
  2. str.decode([encoding,[errors]])

まず、これら2つの関数の「encoding」パラメーターの必要性を理解していません。

各関数の出力、そのエンコーディングは何ですか?各関数での「encoding」パラメーターの使用法は何ですか?「バイト文字列」の定義がよくわかりません。

重要な質問があります。あるエンコーディングから別のエンコーディングに渡す方法はありますか?ASN.1で「オクテット文字列」に関するテキストを読んだことがあるので、「バイト文字列」と同じかどうか疑問に思いました。

助けてくれてありがとう。

4

4 に答える 4

24

Python 2では(Python 3と比較して)少し複雑です。これは、「文字列」と「バイト文字列」の概念をかなり統合しているためですが、「絶対最小すべてのソフトウェア開発者は絶対に、Unicodeと文字セットについて確実に知っておく必要があります」を参照してください。 。基本的に、理解する必要があるのは、「文字列」と「文字」は、コンピューターで直接表現できない抽象的な概念であるということです。バイト文字列は、ディスクから直接(またはディスクから直接書き込むことができる)バイトの生のストリームです。encode抽象から具象になります(できればUnicode文字列を指定すると、バイト文字列が返されます)。decode反対の方向に進みます。

エンコーディングは、「a」はバイトで表され、0x61「α」は2バイトのシーケンスで表される必要があるという規則です0xc0\xb1

于 2012-07-21T23:42:16.993 に答える
18

PyCon、Pragmatic Unicode、またはHow Do I Stop The Painからの私のプレゼンテーションでは、これらすべての詳細について説明しています。

簡単に言うと、Unicode文字列はコードポイントと呼ばれる整数のシーケンスであり、バイト文字列はバイトのシーケンスです。エンコーディングは、Unicodeコードポイントを一連のバイトとして表す方法です。したがってunicode_string.encode(enc)、「enc」でエンコードされたUnicode文字列のバイト文字列を返し、「enc」でbyte_string.decode(enc)バイト文字列をデコードして作成されたUnicode文字列を返します。

于 2012-07-22T00:04:50.050 に答える
6

Python 2.xには、次の2種類の文字列があります。

  • str="バイト文字列"=オクテットのシーケンス。これらは、「レガシー」文字エンコード(windows-1252IBM437など)と生のバイナリデータ(struct.pack出力など)の両方に使用されます。
  • unicode="Unicode文字列"= Pythonの構築方法に応じて、 UTF-16またはUTF-32のシーケンス。

このモデルはPython3.x用に変更されました

  • 2.xunicodeは3.xになりましstrた(そしてuプレフィックスはリテラルから削除されました)。
  • bytesバイナリデータを表すためのタイプが導入されました。

文字エンコードは、Unicode文字列とバイト文字列の間のマッピングです。Unicode文字列をバイト文字列に変換するには、次のencode方法を使用します。

>>> u'\u20AC'.encode('UTF-8')
'\xe2\x82\xac'

他の方法で変換するには、次の方法を使用しますdecode

>>> '\xE2\x82\xAC'.decode('UTF-8')
u'\u20ac'
于 2012-07-21T23:59:22.390 に答える
4

はい、バイト文字列はオクテット文字列です。エンコードとデコードは、テキストの入力/出力時に行われます(コンソール、ファイル、ネットワークなどから/へ)。コンソールは内部でUTF-8を使用する場合があり、Webサーバーはlatin-1を提供し、特定のファイル形式にはBibtexのアクセントのような奇妙なエンコーディングが必要ですfran\c{c}aise。入力/出力でそれらから/に変換する必要があります。

{en|de}codeメソッドはこれを行います。それらは舞台裏で呼ばれることがよくあります(たとえば、print "hello world"端末が使用するものに文字列をエンコードします)。

于 2012-07-21T23:42:03.330 に答える