Pythonでプログラミング学習を進めていくと、多くの人が一度は遭遇するであろう壁、それが「日本語の文字化け」です。
ファイルから読み込んだテキストが意味不明な文字列になったり、UnicodeDecodeErrorという見慣れないエラーに悩まされたりした経験がある方も多いでしょう。
この文字化け問題は、実はPythonに限った話ではなく、コンピュータが文字を扱う上での基本的な仕組みに起因しています。
しかし、その原因と正しい対処法さえ理解してしまえば、決して怖いものではありません。
この記事では、Pythonにおける日本語の文字化け問題について、その根本原因から、ファイル操作やライブラリ利用時といった具体的なケース別の解決策まで、豊富なサンプルコードと共に徹底的に解説します。
SNSでの評判の良さも圧倒的なプログラミングスクール『RUNTEQ(ランテック)』!

✅受講生からの評判が驚くほど良い
✅学習はハードだが未経験とは思えないほど高いスキルが身に付く
✅挫折させない万全なサポート体制が用意されている
✅採用面接で担当者に刺さるレベルの高い「ポートフォリオ」を作成できる
✅給付金を使えば実質約13万円という格安料金で受講できる

エンジニア転職を目指すならRUNTEQ一択です。
\勧誘行為は一切なし! 相談だけでもOK! /
なぜPythonで文字化けは起きるのか?文字コードの基本を理解しよう
文字化けの謎を解く鍵は、「文字コード」という概念にあります。
コンピュータの内部では、すべてのデータが最終的に数値(0と1の羅列)として扱われています。
私たちが普段目にしている「あ」や「漢」といった文字も、そのままの形で記録されているわけではありません。
コンピュータは、「あ」という文字には「12345」という番号、「漢」という文字には「67890」という番号、といったように、文字と数値を対応させた巨大な対応表を持っており、この対応表のことを「文字コード(文字エンコーディング)」と呼びます。
問題なのは、この対応表が、歴史的な経緯から一種類ではないことです。
特に日本語を扱う上で重要な文字コードには、主に以下の2つが存在します。
【UTF-8】
現在、Webサイトや多くのアプリケーションで標準的に使われている、世界中の文字を扱える文字コード。
【Shift_JIS】
古くからWindows環境で標準的に使われてきた、日本語専用の文字コード。
文字化けは、この対応表の食い違いによって発生します。
例えば、Shift_JISの対応表を使って「こんにちは」と書かれたファイルを、UTF-8の対応表で無理やり読もうとすると、コンピュータは各数値に対応する文字を見つけられず、結果として意味不明な文字列やエラーとして表示してしまうのです。
これが文字化けの正体です。
Pythonにおける文字化けの解決の鍵はencodingの正しい指定
文字化けの原因が「文字コードの食い違い」であるならば、解決策は至ってシンプルです。
それは、「Pythonに対して、今から扱うファイルの文字コードが何であるかを正しく教えてあげる」ことです。
Pythonでファイルを開いたり、ライブラリでデータを読み込んだりする際には、多くの場合encodingという引数(オプション)を指定できます。
この引数に、対象ファイルの正しい文字コード('utf-8'や'shift_jis'など)を指定することで、Pythonは適切な対応表を使って文字を解釈し、文字化けを防ぐことが可能になります。
近年の開発環境ではUTF-8が主流ですが、官公庁の提供するデータや、古いシステムから出力されたCSVファイルなど、依然としてShift_JISで作成されたファイルも多く存在します。
文字を扱う際は、常にそのデータの文字コードが何かを意識することが重要でしょう。
【ケース別】Pythonの日本語文字化けに対する完全対策マニュアル
それでは、実際のプログラミングで遭遇する具体的なケースごとに、文字化けの対策を見ていきましょう。
ケース1:テキストファイルの読み込みで文字化けする場合
外部のテキストファイル(.txtなど)を読み込んで内容を表示する際に、最も文字化けが発生しやすいでしょう。
ファイルの読み書きには、with open(...)構文を使うのが現代のPythonにおける基本です。
準備するファイル (sample_sjis.txt)
ここでは、文字コードがShift_JISで保存された、以下のようなテキストファイルがあるとします。
こんにちは、世界!
これはShift_JISで書かれたテキストです。
サンプルコード
# NG例: encodingを指定しないと、環境によってはエラーになる
try:
with open('sample_sjis.txt', 'r') as f:
content = f.read()
print(content)
except UnicodeDecodeError as e:
print(f"エラーが発生しました: {e}")
print("-" * 20)
# OK例: 正しいencodingを指定する
try:
with open('sample_sjis.txt', 'r', encoding='shift_jis') as f:
content = f.read()
print(content)
except FileNotFoundError:
print("ファイルが見つかりません。")
実行結果
エラーが発生しました: 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte
--------------------
こんにちは、世界!
これはShift_JISで書かれたテキストです。
ソースコードの解説
最初のNG例では、open()関数にencodingを指定していません。
多くの環境ではデフォルトでUTF-8としてファイルを開こうとするため、Shift_JISで書かれたファイルを読み込めずUnicodeDecodeErrorが発生します。
一方、OK例ではencoding='shift_jis'と明示的に指定しています。
これにより、PythonはShift_JISの対応表を使ってファイルを正しく解釈し、日本語を問題なく表示できました。
Windows環境で作成されたファイルの場合は、'cp932'を指定するとより確実な場合もあります。
ケース2:テキストファイルへの書き込みで文字化けする場合
プログラム内で生成した日本語文字列をファイルに書き出す際にも、encodingの指定は同様に重要です。
指定を怠ると、意図しない文字コードでファイルが保存され、他のアプリケーションで開いた際に文字化けする原因となります。
サンプルコード
text_to_write = "これはUTF-8で保存されるべきテキストです。\n2行目です。"
# encodingを指定して、UTF-8でファイルを書き出す
try:
with open('output_utf8.txt', 'w', encoding='utf-8') as f:
f.write(text_to_write)
print("output_utf8.txt をUTF-8で保存しました。")
except Exception as e:
print(f"エラー: {e}")
ソースコードの解説
書き込みモード('w')でファイルを開く際にも、encoding='utf-8'を指定することがベストプラクティスです。
これにより、このスクリプトをどのOS環境で実行しても、生成されるoutput_utf8.txtは必ずUTF-8で保存されることが保証されます。
ケース3:CSVファイルの読み書き(Pandas)で文字化けする場合
データ分析で多用されるPandasライブラリでCSVファイルを扱う際も、文字化けは頻出する問題です。
pandas.read_csv()やDataFrame.to_csv()にも、encoding引数が用意されています。
サンプルコード
import pandas as pd
import io
# Shift_JISで書かれたCSVデータを想定
csv_data_sjis = """id,name,area
1,佐藤,東京
2,鈴木,大阪
""".encode('shift_jis')
# NG例: encodingを指定せずに読み込むと文字化けやエラー
try:
df_ng = pd.read_csv(io.BytesIO(csv_data_sjis))
print(df_ng)
except UnicodeDecodeError as e:
print(f"Pandasでの読み込みエラー: {e}")
print("-" * 20)
# OK例: 正しいencodingを指定して読み込む
df_ok = pd.read_csv(io.BytesIO(csv_data_sjis), encoding='shift_jis')
print(df_ok)
実行結果
Pandasでの読み込みエラー: 'utf-8' codec can't decode byte 0x82 in position 7: invalid start byte
--------------------
id name area
0 1 佐藤 東京
1 2 鈴木 大阪
ソースコードの解説
pandas.read_csv()も、デフォルトではUTF-8でファイルを読み込もうとします。
そのため、Shift_JISのCSVデータを読み込むと、標準のopen()関数と同じようにUnicodeDecodeErrorが発生します。
encoding='shift_jis'(または'cp932')を指定することで、正しくDataFrameにデータを読み込むことができました。
DataFrameをCSVとして書き出すto_csv()メソッドでも、同様にencoding引数を指定できます。
最頻出エラーUnicodeDecodeErrorの原因と対処法
Pythonで日本語を扱っていると、UnicodeDecodeErrorというエラーに遭遇することがあります。
これは、文字化けが表面化するだけでなく、プログラムが停止してしまう深刻なエラーです。
このエラーメッセージは、直訳すると「ユニコードへのデコード(復号)エラー」となります。
これは、Pythonがファイルなどから読み込んだバイト列(数値の羅列)を、指定された文字コード(デフォルトではUTF-8)の対応表を使って人間が読める文字に変換しようとした際に、「対応表に存在しない不正な数値の並びが見つかった」ことを示しています。
原因は、ほぼ100%、指定したencodingと実際のファイルの文字コードが一致していないことです。
このエラーに遭遇したら、慌てずに以下の点を確認してください。
open()やread_csv()でencodingを指定しているか?- 指定している
encodingは、本当にそのファイルの文字コードと合っているか? 'shift_jis'でダメなら'cp932'を試してみる。それでもダメなら、ファイルの作成元に正しい文字コードを確認する。
初心者がPythonでの文字化け解消をはじめとしたスキルを効率的に学ぶには
文字化け解消をはじめとするPythonのスキルを効率的に習得するには、プログラミングスクールの活用が最も近道です。
スクールでスキルを高めることにより、今の仕事に活かしたり、副業として高単価な案件を受注できたりするだけでなく、Pythonエンジニアとして転職することも可能になります。
Pythonエンジニアは需要が非常に高いため、それに比例して年収も高くなる傾向にあります。
「今よりも年収を上げたい」「将来性の高い職種であるエンジニアへ転職したい」といった気持ちが強い場合は、プログラミングスクールでPythonの専門スキルを習得しつつ、ポートフォリオ支援や転職支援を受けてエンジニアへ転職する、という道を目指すのもよいでしょう。
なお、「Pythonに強く、受講生からの評判も良いプログラミングスクール」には、以下のようなところがあります。
- デイトラ
(※格安)
- キカガク
(※専門的)
- Aidemy Premium
(※受講コースが豊富)
その他、以下の記事でもPythonのおすすめスクールをまとめていますので、興味のある方は是非参考にしてください。




