web-dev-qa-db-ja.com

Python(2.7.3)でのエンコードとデコードがわかりません

Python)でencodedecodeを自分で理解しようとしましたが、はっきりしたことは何もありません。

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

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

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

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

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

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

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

21
lvc

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

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

17
Ned Batchelder

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

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

このモデルは Python 3.x に変更されました:

  • 2.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'
6
dan04

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

{en|de}codeメソッドはこれを行います。これらはバックグラウンドで呼び出されることがよくあります(たとえば、print "hello world"は、端末が使用する文字列をエンコードします)。

4
tiwo