【Python】文字列(str)とバイト列(bytes)の相互変換とエンコーディング指定

ネットワーク通信やバイナリファイルの読み書き、あるいはレガシーシステムとの連携において、人間が読める「文字列(str)」と、コンピュータが扱う「バイト列(bytes)」の相互変換は避けて通れない処理です。

Pythonでは、encode()decode() メソッドを使用してこれらの変換を行います。特に日本語環境では shift_jisutf_8、BOM(Byte Order Mark)付きの utf_8_sig など、適切な文字コード(エンコーディング)を指定しないと「文字化け」やエラーの原因となります。

ここでは、IoT機器からのデータ受信を想定し、異なる文字コード間でデータを適切に変換する方法を解説します。

目次

文字列とバイト列の変換ロジック

  • エンコード(Encode): 文字列(str)をバイト列(bytes)に変換すること。「文字」を「数値の並び」にする処理です。
  • デコード(Decode): バイト列(bytes)を文字列(str)に変換すること。「数値の並び」を人間が読める「文字」に戻す処理です。

実装例:レガシー機器との通信データ変換

以下のコードは、Shift_JISを使用する古い計測機器と、UTF-8を使用する現代的なシステムの間で、ステータス文字列をやり取りするシミュレーションです。

def main():
    # 1. 文字列からバイト列への変換 (encode)
    # 送信したいステータスデータ
    original_text = "正常動作中"

    print(f"【元の文字列】: {original_text}\n")

    # ケースA: UTF-8でエンコード(現代の標準)
    # 一般的なWeb APIやLinux環境などで使用されます
    bytes_utf8 = original_text.encode("utf_8")
    print(f"UTF-8バイト列   : {bytes_utf8}")
    # 出力例: b'\xe6\xad\xa3\xe5\xb8\xb8...' (1文字3バイトが基本)

    # ケースB: Shift_JISでエンコード(レガシー環境)
    # Windowsの古いアプリや、日本の古い組み込み機器で使用されます
    bytes_sjis = original_text.encode("shift_jis")
    print(f"Shift_JISバイト列: {bytes_sjis}")
    # 出力例: b'\x90\xb3\x8f\xed...' (1文字2バイトが基本)

    # ケースC: BOM付きUTF-8 (utf_8_sig)
    # ExcelなどでCSVを開く際に文字化けを防ぐために使われる形式です
    bytes_bom = original_text.encode("utf_8_sig")
    print(f"UTF-8(BOM)バイト列: {bytes_bom}")
    # 先頭に \xef\xbb\xbf という署名(BOM)が付与されます

    print("\n" + "="*30 + "\n")

    # 2. バイト列から文字列への復元 (decode)
    # 外部から受信したバイトデータだと仮定して、文字列に戻します

    # Shift_JISのバイト列を正しくデコードする
    # エンコード時と同じ形式を指定する必要があります
    received_text = bytes_sjis.decode("shift_jis")
    print(f"【受信・復元】Shift_JISデータ: {received_text}")

    # 3. 異なるエンコーディングでデコードしようとした場合のエラー
    try:
        # Shift_JISのデータをUTF-8として読もうとするとエラーになります
        _ = bytes_sjis.decode("utf_8")
    except UnicodeDecodeError as e:
        print(f"【変換エラー】: {e}")

if __name__ == "__main__":
    main()

技術的なポイント

代表的なエンコーディング

  • utf_8: 世界的に最も標準的な形式。日本語は通常1文字3バイトで表現されます。
  • shift_jis (または cp932): 日本のWindows環境や古いシステムで広く使われている形式。日本語は通常1文字2バイトです。
  • ascii: 英数字のみの形式。日本語が含まれるとエラーになります。
  • utf_8_sig: ファイルの先頭に「これはUTF-8です」というマーク(BOM)が付いた形式。特にWindowsのExcelでCSVを扱う際、これがないと文字化けすることがあります。

エラーハンドリング エンコード形式が不一致の場合、UnicodeDecodeError が発生します。外部データを取り込む際は、そのデータがどの文字コードで作られているか(仕様書などでの確認)が非常に重要です。不明な場合は chardet などのライブラリで推定することもありますが、基本は仕様に合わせて明示的に指定します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次