Introduction
この記事では、PythonでBytesをStringに変換する方法を見てみましょう。
使用しているPythonのバージョンによって、この作業は異なります。
Convert Bytes to String in Python 3
Python 3以降、古いASCIIのやり方は廃止され、Pythonは完全にUnicodeになりました。
これは、明示的なunicode型を失ったことを意味します。 u"string"
u"string"
です。
これらの文字列を旧来のバイト文字と区別するために、b"string"
という新しい指定子が導入されました。
これは Python 2.6で追加されましたが、2.6ではすべての文字列がバイト文字だったため、Python 3への準備以外には特に目的はありませんでした。
Python 3でのバイト文字は正式にはbytes
<= x <bytes
bytearray
bytes
に似ていますが、変更可能です。
decode()を使用してバイトを文字列に変換する
バイトを文字列に変換する方法を見てみましょう。
エンコーディング形式をパスすることで、bytes
オブジェクトを文字列にデコードし、それをプリントしました。
コーデックを使用してバイトを文字列に変換する
別の方法として、組み込みの codecs
モジュールをこの目的にも使用することができます:
>>> import codecs>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> codecs.decode(b, 'UTF-8')"Let's grab a 🍕!"
エンコーディング パラメーターを渡す必要はありませんが、渡すことをお勧めします。
>>> codecs.decode(b)"Let's grab a 🍕!"
str()を使ってバイトを文字列に変換する
最後に、str()
関数を使うと、さまざまな値を受け取って文字列に変換することができます。
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> str(b, 'UTF-8')"Let's grab a 🍕!"
ただし、str()
str()
UTF-16
で使おうとすると、次のようになります。
>>> str(b, 'UTF-16')'敌❴\u2073牧扡愠\uf020趟↕'
これは、Python 3 が Unicode を前提としていることを考えると、さらに重要なことです。
Convert Bytes to String in Python 2
Python 2では、バイトの束と文字列は実質的に同じものです – 文字列は1バイト長の文字で構成されるオブジェクトで、1つの文字が256個の値を格納できます。 文字列は1バイト長の文字からなるオブジェクトで、1文字あたり256個の値を格納できるため、バイト文字列と呼ばれることもあります。
これはバイトデータを扱うときにはとても便利で、変数にロードするだけで印刷の準備ができます。
>>> s = "Let's grab a 🍕!">>> s'Lets grab a \xf0\x9f\x8d\x95!'# Where has the pizza gone to?>>> len(s)17# Shouldn't that be 15?
バイトをUnicodeに変換する(Python 2)
ここでは、Python 3で想定され、自動的に使用されるPython 2のUnicode
型を使用する必要があります。 これは文字列をバイトではなく、一連のコードポイントとして格納します。
\xf0\x9f\x8d\x95
は、PythonがバイトをASCII文字として表現する方法を知らないため、2桁の16進数として表現します。
>>> u = u"Let's grab a 🍕!"u"Let's grab a \U0001f355!"">>> u"Let's grab a 🍕!"# Yum.>>> len(u)15
上記のように、Unicode 文字列には \U0001f355
が含まれています。これは Unicode でエスケープされた文字で、端末はピザのスライスとして出力する方法を知っています。 この設定は、バイト文字の値の前に u
指定子を使用するだけの簡単なものでした。
では、どのようにして 2 つの文字列を切り替えればよいのでしょうか。 これは、Unicode オブジェクトを構築し、引数としてバイト文字列とエンコーディング名を含む文字列を与えるか、バイト文字列に対して
.decode(encoding)
を呼び出すことで行うことができます。Convert Bytes to String Using decode() (Python 2)
codecs
を使用することもできます。>>> s = "Let's grab a \xf0\x9f\x8d\x95!">>> u = unicode(s, 'UTF-8')>>> u"Let's grab a 🍕!">>> s.decode('UTF-8')"Let's grab a 🍕!"
Convert Bytes to String Using codecs (Python 2)
または、
codecs
モジュールを使用します。import codecs>>> codecs.decode(s, 'UTF-8')"Let's grab a 🍕!"
エンコーディングに注意する
ここで注意が必要なのは、バイトはエンコーディングによって異なって解釈される可能性があるということです。 約 80 の異なるエンコーディングが利用可能なので、正しいエンコーディングを使用しているかどうかを判断するのは簡単ではありません!
元のメッセージは
øç
јч
であり、どちらも有効な変換であるように見えます。結論
プログラマーとして、落とし穴を避けるために常に考え、積極的に準備しなければならないことがあります。 これは、Python のような高級言語を日常的に使用しているときにはめったに行かない低レベルに特に当てはまります。
文字コード、エンコーディング、およびバイナリのようなものは、私たちの仕事がコードを書くこと、つまり思考を動作するソリューションにエンコードすることであることを思い出させるためにあります。
この記事では、Python でバイトを文字列に変換する方法を説明しました
。