Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの文字列(str)とバイト文字列(bytes)の違いをわかりやすく解説

文字列とバイト文字列の基本的な違い

Pythonにおける文字列(str)は「文字」の並びであり、これは抽象的な概念です。そのため、そのままではディスクに保存することができません。

一方、バイト文字列(bytes)は「バイト」の並びであり、実際にディスクへ保存できるデータです。

この両者をつなぐのがエンコーディング(符号化方式)です。エンコーディングには非常に多くの種類があり(理論上は無限に存在します)、変換を行う際にはどのエンコーディングが使われているのかを正しく把握しておく必要があります。

なぜエンコーディングの指定が重要なのか

同じバイト列でも、解釈するエンコーディングが異なれば、まったく別の文字列として読み取られることがあります。つまり、同一のバイト文字列が、異なるエンコーディングのもとでは2つの異なる文字列を表しうるのです。

具体例

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

このように、まったく同じバイト列であっても、utf-16としてデコードすれば意味不明な文字列になり、utf-8としてデコードすればギリシャ語の「τoρνoς」という正しい文字列が得られます。

decode() と encode() の使い方

正しいエンコーディングさえ分かれば、変換は簡単です。

  • バイト文字列 → 文字列: バイト文字列の .decode() メソッドを使います。指定したエンコーディングに基づいて、適切な文字列を取得できます。
  • 文字列 → バイト文字列: 文字列の .encode() メソッドを使います。こちらは逆方向の変換で、文字列を指定したエンコーディングのバイト列へ変換します。
>>> s = 'こんにちは'
>>> b = s.encode('utf-8')   # 文字列 → バイト列
>>> b
b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'
>>> b.decode('utf-8')       # バイト列 → 文字列
'こんにちは'

実務での注意点

テキストファイルを読み書きする際や、ネットワーク通信・外部APIとのデータやり取りを行う際には、必ずエンコーディングを意識しましょう。誤ったエンコーディングを指定すると UnicodeDecodeErrorUnicodeEncodeError が発生したり、文字化けが起こったりします。

日本語環境では特に、UTF-8以外にShift_JISやEUC-JPといったエンコーディングが使われることもあるため、データの由来に応じて適切なエンコーディングを選択することが重要です。迷った場合は、現在主流となっているUTF-8を第一候補として検討するとよいでしょう。

  1. 【Python】Tkinterのroot.destroy()とroot.quit()の違いを徹底解説

    PythonのGUIライブラリ「Tkinter」では、アプリケーションを終了する方法として destroy() と quit() の2つのメソッドがよく使われます。似たような役割に見えますが、実際には動作が異なります。この記事では、それぞれの違いをサンプルコード付きでわかりやすく解説します。 root.destroy()とは tkinterのウィンドウオブジェクトに対して destroy() メソッドを呼び出すと、mainloop の処理が終了し、ウィンドウ内のすべてのウィジェットが破棄されます。つまり、ウィンドウそのものが完全に閉じられ、バックグラウンドで動作しているインタプリタ(Tcl/T

  2. Pythonのtkinterとtkinter.ttkウィジェットの違いとは?スタイリング方法を解説

    tkinter.ttkは、tkinterウィジェットのスタイル(見た目)を設定するためのモジュールです。HTML要素にCSSでデザインを適用するように、tkinter.ttkを使うことでtkinterウィジェットの外観を自由にカスタマイズできます。 tkinterウィジェットとtkinter.ttkの主な違い tkinterウィジェットは、ボタン・ラベル・テキスト・スクロールバーなど、基本的なGUI部品を追加するために使用します。一方、tkinter.ttkは標準のtkinterよりも多くの種類のウィジェットをサポートしています。 tkinter.ttkではPlaceやPack()、Grid