web-dev-qa-db-ja.com

文字列とバイト文字列の違いは何ですか?

バイト文字列を返すライブラリを使用していますが、これを文字列に変換する必要があります。

違いが何であるかはわかりませんが-もしあれば。

152
Sheldon

Python 3(Python 2の場合、この違いはやや明確ではありません)-文字列は文字のシーケンス、つまり nicode codepoints ;これらは抽象的な概念であり、ディスクに直接保存することはできません。バイト文字列は、当然のことながら、バイトのシーケンスです-がディスクに保存できるもの。それらの間のマッピングはencodingです-これらは非常に多くあり(無限に多く可能です)-そしてどれが異なるエンコーディングが同じバイトを異なる文字列にマッピングする可能性があるため、変換を行うための特定のケース:

>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'

どれを使用するかがわかったら、バイト文字列の.decode()メソッドを使用して、上記のように正しい文字列を取得できます。完全を期すために、文字列の.encode()メソッドは逆の方法になります。

>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
204
lvc

コンピューターが保存できる唯一のものはバイトです。

コンピューターに何かを保存するには、まずencode it、つまりバイトに変換する必要があります。例えば:

  • 音楽を保存する場合は、最初にencodeMP3WAVなどを使用して保存する必要があります。
  • 画像を保存する場合は、最初にエンコードPNGJPEGなどを使用して画像を保存する必要があります。
  • テキストを保存する場合は、最初にエンコードASCIIUTF-8などを使用してテキストを保存する必要があります。

MP3WAVPNGJPEGASCII、およびUTF-8は、エンコードの例です。エンコーディングとは、オーディオ、画像、テキストなどをバイト単位で表現する形式です。

Pythonでは、バイト文字列は単なるバイトシーケンスです。人間が読むことはできません。内部では、すべてをバイト文字列に変換してからコンピューターに保存する必要があります。

一方、多くの場合「文字列」と呼ばれる文字列は、一連の文字です。人間が読める形式です。文字列はコンピューターに直接保存することはできません。最初にエンコードにする必要があります(バイト文字列に変換)。 ASCIIUTF-8など、文字列をバイト文字列に変換できる複数のエンコーディングがあります。

'I am a string'.encode('ASCII')

上記のPythonコードは、エンコードASCIIを使用して文字列'I am a string'をエンコードします。上記のコードの結果はバイト文字列になります。印刷すると、Pythonはb'I am a string'として表されます。ただし、バイト文字列人間が読める形式ではないであることを思い出してください。印刷時にPythonがASCIIからデコードします。 Pythonでは、バイト文字列はbで表され、その後にバイト文字列のASCII表現が続きます。

バイト文字列は、エンコードに使用されたエンコードがわかっている場合、デコード文字列に戻すことができます。

b'I am a string'.decode('ASCII')

上記のコードは、元の文字列'I am a string'を返します。

エンコードとデコードは逆の操作です。ディスクに書き込む前にすべてをエンコードする必要があり、人間が読む前にデコードする必要があります。

303
Zenadix

Python 2では、strは8ビット値のシーケンスで構成され、unicodeはUnicode文字のシーケンスで構成されます。注意すべき点は、strが7ビットASCI文字のみで構成されている場合、unicodeおよびstrを演算子と一緒に使用できることです。

Pythonでは、bytesは8ビット値のシーケンスで構成され、strはUnicode文字のシーケンスで構成されます。 bytesおよびstrは、>+などの演算子と一緒に使用できません。

ヘルパー関数を使用して、Python 2のstrunicodeの間、およびPython 3.のbytesstrの間で変換すると便利な場合があります。

11
lmiguelvargasf

から nicodeとは

基本的に、コンピューターは数字を扱うだけです。文字やその他の文字を保存するには、それぞれに番号を割り当てます。

......

Unicodeは、プラットフォーム、プログラム、言語に関係なく、すべての文字に一意の番号を提供します。

そのため、コンピューターが文字列を表す場合、一意のUnicode番号を通じて文字列のコンピューターに保存されている文字を見つけ、これらの数字はメモリに保存されます。ただし、これらの数字は単なる10進数であるため、文字列をディスクに直接書き込んだり、一意のUnicode番号を介してネットワーク上で文字列を送信したりすることはできません。文字列をUTF-8などのバイト文字列にエンコードする必要があります。 UTF-8は、可能なすべての文字をエンコードできる文字エンコードであり、文字をバイトとして格納します( this のように見えます)。 UTF-8はほぼどこでもサポートされているため、エンコードされた文字列はどこでも使用できます。 UTF-8でエンコードされたテキストファイルを他のシステムから開くと、コンピューターはそれをデコードし、一意のUnicode番号を使用してその中の文字を表示します。ブラウザーは、ネットワークからエンコードされた文字列データUTF-8を受信すると、データを文字列にデコードし(UTF-8エンコードでブラウザーを想定)、文字列を表示します。

Python3では、文字列とバイト文字列を相互に変換できます。

>>> print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文 

Wordでは、文字列はコンピューターで読むために人間に表示するためのものであり、バイト文字列はディスクに保存してデータ送信するためのものです

3
Sam Yang