【Python】日本語が文字化けする原因と対処方法を初心者向けにわかりやすく解説

はじめに

Pythonで日本語を扱うと、「あれ、なんだか文字が変な記号になってしまう」という経験はないでしょうか。
このような状況はいわゆる文字化けと呼ばれ、ファイルの読み書きやターミナルの出力などで起こりがちです。

皆さんがプログラムを作成するとき、日本語のエラーメッセージやユーザーへのメッセージ表示を想定することは多いと思います。
しかし文字化けが発生すると、ユーザー体験が分かりにくくなりますし、何より開発者自身が意図した挙動を確認できなくなりがちです。

本記事では、Pythonでよく起こる日本語文字化けの原因と対処法について解説します。
実務でもよくあるファイル操作やターミナルへの出力の場面を例に、できるだけ具体的にポイントを整理していきましょう。

この記事を読むとわかること

  • Pythonで発生する日本語文字化けの仕組み
  • 文字エンコーディングを正しく指定する方法
  • 実務でありがちなファイル操作やCSV処理での日本語対応
  • ターミナル出力時に文字化けを防ぐコツ
  • 文字化けのトラブルシューティング手順

それでは順を追って見ていきましょう。

Pythonで起こる日本語文字化けとは

日本語文字化けは、Pythonプログラムで日本語を扱う際に発生する文字の乱れや「�」などの文字が表示される現象のことを指します。
本来表示したい日本語が、別の文字コードとして解釈されてしまうことで、このような問題が起こります。

多くのケースで、Python自体はUTF-8というエンコード方式に対応しています。
しかし、ファイルの中身やOSの設定、ターミナルのエンコード方式が一致していないと、文字化けが発生しがちです。
初心者の方は、Windows環境で開発しているときに特に遭遇しやすいかもしれません。

また、ファイル書き込み時には気づかなくても、別のテキストエディタでファイルを開いた途端に文字化けが発生する、といったパターンもよくあります。
こうした問題を回避するには、常に「どの部分でどんなエンコード方式が使われているか」を意識しておくことが肝心です。

なぜ日本語文字化けが起きるのか

文字化けは技術的には「文字コードの不一致」が原因です。
Python自体は文字列を内部的にUnicodeで扱いますが、入出力の段階でファイルやターミナルが別のエンコード方式(SHIFT_JISなど)を使っていると、正しい文字列のやり取りができなくなります。

たとえば、次のようなケースが典型的です。

  1. ファイルのエンコードがSHIFT_JISで、Pythonの読み込み設定がUTF-8のまま
  2. ターミナル (コマンドプロンプト) がSHIFT_JISを使っているのに、コードはUTF-8の前提でprintしている
  3. そもそもWindowsの環境設定がShift_JISのままで、Pythonコードには特にエンコード指定がない

このように、Pythonだけでなく開発環境全体の設定が影響し合う点が文字化けの根本原因といえます。
複数人で開発を進める場合や、ファイルを外部から取り込む場合は特に注意が必要です。

そこで、以下ではどのようにエンコードを整合させるか、具体的な方法を紹介します。
「原因がよくわからないまま文字化けしている」という場合でも、ポイントを押さえればスムーズに解決できるはずです。

文字エンコーディングを正しく指定する方法

Pythonでは、ファイルを読み書きする際にエンコーディングを明示的に指定することで、文字化けを回避しやすくなります。
特に、初心者の方が間違いやすいのは、ファイル操作のときにopen()関数で何も指定せずに使ってしまうことです。

以下の例では、UTF-8で書き込んだテキストファイルを正しく読み込むサンプルを示します。
実務でもよく使うパターンなので、参考にしてみてください。

# 日本語テキストをUTF-8で読み込む例

file_path = "example.txt"

with open(file_path, mode="r", encoding="utf-8") as f:
    content = f.read()

print(content)

上記のように、open()関数に対してencoding="utf-8"を指定するだけで、多くの日本語文字化けを防ぐことができます。
これは、ファイルの中身が実際にUTF-8で保存されていることが前提となる点にご注意ください。
もしファイルがSHIFT_JISで保存されているのであれば、encoding="cp932"(Windowsの標準)を使うなど、ファイル実態に合ったエンコード指定を行う必要があります。

また、Pythonスクリプト内で日本語のコメントや文字列リテラルを扱う場合にも、エディタの文字コードがUTF-8に設定されているかは確認しておきましょう。
エディタやIDEによっては、設定が異なるかもしれません。

実務でよくある事例: CSVファイルの読み書き

文字化けで悩まされる場面の1つに、CSVファイルをPythonで扱うケースが挙げられます。
Excelや他のソフトウェアで作成したCSVがSHIFT_JISで保存されている一方、Pythonでの処理はUTF-8前提ということがよくあるからです。

以下は、CSV読み込みの例です。
Pythonのcsvモジュールを使い、エンコードをUTF-8に指定しています。

import csv

csv_file = "data.csv"

with open(csv_file, mode="r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

もし、元のCSVがSHIFT_JISで保存されていれば、encoding="cp932"に書き換えてください。
このように、どの文字コードで保存されているかを把握しておくことが肝心です。

実務では、複数の部署やクライアントからCSVファイルが送られてきて、エンコードがまちまちという状況もあります。
その際は、ファイルの作成元と一緒にエンコード方式を確認するか、実際に文字化けするかどうかテストして最適な設定を探っていくとよいでしょう。

実務でよくある事例: ターミナルでの出力

文字化けはファイル操作だけでなく、ターミナル(コマンドプロンプトやターミナルエミュレータ)への出力でも発生することがあります。
たとえば、WindowsのコマンドプロンプトがデフォルトでSHIFT_JISを使っている場合、print("こんにちは")と書いても意図した表示にならないことがあるかもしれません。

対策の一例として、ターミナルのエンコードをUTF-8に変更することが挙げられます。
Windowsのコマンドプロンプトでは、以下のようにコマンドを入力して文字コードを変更できます。

chcp 65001

このコマンドにより、コマンドプロンプトがUTF-8を使うようになります。
その後にPythonスクリプトを実行すると、日本語が正しく表示される可能性が高くなるわけです。

ただし、開発環境によっては別のターミナルや統合開発環境(IDE)を使っているかもしれません。
その場合は、IDE側の設定をUTF-8に合わせておくことが必要です。
エンコードの指定方法はツールによって違うため、どのように出力されるかを確認しながら設定を見直してみてください。

よくあるトラブルシューティング

日本語文字化けを完全に防ぐには、基本的な対策をしっかり押さえるとともに、想定外の環境やファイルが混ざった場合にも柔軟に対応することが大切です。
ここでは、初心者の方が特に引っかかりがちなポイントをまとめます。

Pythonスクリプト自体の文字コード

エディタやIDEで新規ファイルを作るときは、UTF-8が標準的に選ばれているか確認しましょう。
プロジェクト全体で同じエンコードを使っていると、文字化けを減らしやすくなります。

外部から取り込むファイルのエンコード

CSVやテキストファイルの作成元に問い合わせるか、自分で実際に開いてみて、どのエンコード方式が使われているかを確認しましょう。
あやふやな状態でencoding="utf-8"を指定すると、余計に文字化けするケースもあります。

ターミナルやコンソールのエンコード

WindowsのコマンドプロンプトはSHIFT_JIS、LinuxやMacのターミナルはUTF-8、というように環境ごとに差異があります。
皆さんが普段使う環境のエンコードを一度チェックしておくと、いざというときに混乱しにくいでしょう。

もしファイル単位でエンコードをいちいち確認するのが難しい場合は、ファイル名やディレクトリ構造などにエンコードをメモしておくとトラブルが減ります。
チーム開発のときに「このファイルはSHIFT_JISなんだっけ?UTF-8だっけ?」と聞かれることを防げるでしょう。

ソースコード上での明示的なエンコード指定

Python 3系では、ソースファイルの先頭に# -*- coding: utf-8 -*-という宣言を書くケースはあまり見なくなりました。
ですが、エディタの設定とソースコードの文字コードがズレているときには、この宣言によって文字化けが解消される場合もあります。
まずはエディタの設定を見直し、それでも問題があるなら試してみる価値があるでしょう。

具体的なコード例: エンコードが混在した場合の対応

ここでは、同じプロジェクト内に複数の異なるエンコード方式のファイルが混在している想定で、読み込み処理を分けるサンプルを紹介します。
現場でも、すべてをUTF-8に統一したいのに、古いシステムから持ってきたファイルだけはSHIFT_JISということが時々あります。

# 複数ファイルを読み込む想定
file_info = {
    "utf8_file.txt": "utf-8",
    "sjis_file.txt": "cp932"
}

for f_name, enc in file_info.items():
    with open(f_name, mode="r", encoding=enc) as f:
        content = f.read()
    print(f"ファイル名: {f_name}, エンコード: {enc}")
    print(content)

このように、ファイルごとにエンコードを変えて読み込むことで、文字化けを回避できます。
実務では、ファイルをすべて一括で読み込む際に「このファイルだけ文字化けする…」と頭を抱える場面があるかもしれません。
そんなときは、こうした個別指定の方法を検討してみてください。

「とにかくUTF-8に変換すればいい」という考え方だけでなく、実際に使われているエンコード方式を見極めながら運用することが大切です。
やみくもに変換すると、後から「部分的に文字化けしている」などのトラブルが出ることもあります。

まとめ

ここまで、Pythonで日本語を扱う際によく起こる文字化けの原因と対策について解説しました。
文字化けは「文字コードが一致しない状態」が大元の原因です。
しかし対策としては、次のような点を押さえておけば比較的スムーズに回避できます。

  • ファイルの読み書き時にはopen(..., encoding="utf-8")のようにエンコードを明示的に指定する
  • CSVなど外部ファイルのエンコード方式を事前に確認し、正しく設定する
  • ターミナルや開発環境のエンコード設定も確認し、必要に応じてUTF-8に切り替える
  • プロジェクト全体でエンコードを統一するか、どうしても統一できない場合は個別に管理する

実務では日本語のエラーメッセージやログ出力を扱う機会も増えるでしょう。
その際、文字化けが頻発すると原因追及が難しくなります。
記事で紹介した基本的なポイントを押さえて、日本語でのやり取りをスムーズに行いましょう。
ぜひ、皆さんの開発プロジェクトでも役立ててみてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。