web-dev-qa-db-ja.com

バイト文字列とUnicode文字列。 Python

Pythonのバイト文字列とUnicode文字列の違いを詳しく説明してください。私は読んだ this

バイトコードは、単にバイト配列に変換されたソースコードです

Pythonには独自のコーディング/エンコーディング形式がありますか?それともオペレーションシステム設定を使用していますか?わかりません。説明していただけますか?ありがとうございます!

37
ashim

Python 3.にしか当てはまらない簡単な説明を試みます。私は、素人の人から来て、それが完全に未経験者の混乱を解消するのに役立つことを願っています。 、ご容赦ください。お気軽にご指摘ください。

通常の方法でPython 3を使用して文字列を作成するとします。

stringobject = 'ant'

stringobjectはUnicode文字列です。

Unicode文字列は、Unicode文字で構成されています。上記のstringobjectでは、Unicode文字は個々の文字です。蟻

各ユニコード文字には、16進数のシーケンスとして表現できるコードポイントが割り当てられます(16進数は、0〜9およびA〜Fの範囲の16個の値を取ることができます)。例えば、文字'a''\u0061'と同等で、 'ant'は'\u0061\u006E\u0074'と同等です。

入力すると、

stringobject = '\u0061\u006E\u0074'
stringobject

出力'ant'も取得します。

現在、-エンコードと呼ばれるプロセスで、nicodeはバイトに変換されますです。 バイトをユニコードに変換するの逆のプロセスはデコードとして知られています。

これはどのように行われますか?各16進数字は16の異なる値を取ることができるため、4ビットのバイナリシーケンスに反映できます(たとえば、16進数字0は0000として2進で表現でき、16進数字1は0001などとして表現できます)。 Unicode文字に4つの16進数字で構成されるコードポイントがある場合、エンコードするには16ビットのバイナリシーケンスが必要です。

エンコードシステムが異なると、Unicodeをビットに変換するためのルールが異なります。最も重要なこととして、エンコードは、各ユニコード文字を表現するために使用するビット数が異なります。

たとえば、ASCIIエンコーディングシステムは文字ごとに8ビット(1バイト)しか使用しません。したがって、最大2桁のコードポイント(つまり256種類のユニコード文字)のユニコード文字のみをエンコードできます。 。UTF-8エンコーディングシステムは、文字ごとに8〜32ビット(1〜4バイト)を使用するため、最大8桁の16進数までのコードポイントを持つUnicode文字、つまりすべてをエンコードできます。

次のコードを実行します:

byteobject = stringobject.encode('utf-8')
byteobject, type(byteobject)

utf-8エンコードシステムを使用してUnicode文字列をバイト文字列に変換し、b'ant', bytes'を返します。

エンコードシステムとして「ASCII」を使用した場合、「ant」のすべてのコードポイントは1バイトで表現できるため、問題は発生しません。しかし、2桁の16進数より長いコードポイントを持つ文字を含むUnicode文字列がある場合、UnicodeEncodeErrorを取得します。

同様に、

stringobject = byteobject.decode('utf-8')
stringobject, type(stringobject)

'ant', strを提供します。

29
runawaykid