Python)でencode
とdecode
を自分で理解しようとしましたが、はっきりしたことは何もありません。
str.encode([encoding,[errors]])
str.decode([encoding,[errors]])
まず、これら2つの関数の「encoding」パラメーターの必要性を理解していません。
各関数の出力、そのエンコーディングは何ですか?各関数での「encoding」パラメーターの使用法は何ですか? 「バイト文字列」の定義がよくわかりません。
重要な質問があります。あるエンコーディングから別のエンコーディングに渡す方法はありますか? ASN.1で「オクテット文字列」に関するテキストを読んだので、「バイト文字列」と同じかどうか疑問に思いました。
助けてくれてありがとう。
Python 2(Python 3)と比較して)では、「文字列」と「バイト文字列」の概念がかなり複雑になるため、少し複雑になります。しかし、 すべてのソフトウェア開発者は絶対に、Unicodeと文字セットについて絶対に知っておく必要があります を参照してください。基本的に、理解する必要があるのは、「文字列」と「文字」は抽象的な概念であり、バイト文字列は、ディスクから直接(またはディスクから直接書き込むことができる)バイトの生のストリームです。encode
は抽象から具体になります(できればユニコード文字列を指定します。バイト文字列を返します); decode
は逆になります。
エンコーディングは、「a」をバイト0x61
で表し、「α」を2バイトのシーケンス0xc0\xb1
で表す必要があるという規則です。
PyConからの私のプレゼンテーション、 Pragmatic Unicode、または、How Do I Stop The Pain は、これらすべての詳細をカバーしています。
簡単に言うと、Unicode文字列はコードポイントと呼ばれる整数のシーケンスであり、バイト文字列はバイトのシーケンスです。エンコーディングは、Unicodeコードポイントを一連のバイトとして表す方法です。したがって、unicode_string.encode(enc)
は「enc」でエンコードされたUnicode文字列のバイト文字列を返し、byte_string.decode(enc)
は「enc」でバイト文字列をデコードして作成されたUnicode文字列を返します。
Python 2.xには、次の2種類の文字列があります。
str
= "バイト文字列" =オクテットのシーケンス。これらは、「レガシー」文字エンコード( windows-1252 または IBM437 など)と生のバイナリデータ(struct.pack
出力など)の両方に使用されます。unicode
= "Unicode文字列" =シーケンス TF-16 または TF-32 方法に応じてPython is構築されました。このモデルは Python 3.x に変更されました:
unicode
は3.xstr
になりました(そしてu
プレフィックスはリテラルから削除されました)。bytes
型が導入されました。文字エンコード は、Unicode文字列とバイト文字列の間のマッピングです。 Unicode文字列をバイト文字列に変換するには、encode
メソッドを使用します。
>>> u'\u20AC'.encode('UTF-8')
'\xe2\x82\xac'
逆に変換するには、decode
メソッドを使用します。
>>> '\xE2\x82\xAC'.decode('UTF-8')
u'\u20ac'
はい、バイト文字列はオクテット文字列です。エンコードとデコードは、テキストの入力/出力(コンソール、ファイル、ネットワークなどから/へ)時に行われます。コンソールは内部でUTF-8を使用する場合があり、Webサーバーはlatin-1を提供し、特定のファイル形式にはBibtexのアクセントのような奇妙なエンコーディングが必要です:fran\c{c}aise
。入力/出力でそれらから/に変換する必要があります。
{en|de}code
メソッドはこれを行います。これらはバックグラウンドで呼び出されることがよくあります(たとえば、print "hello world"
は、端末が使用する文字列をエンコードします)。