はじめに
Python スクリプトを実行した際、突然以下のようなエラーが出て処理が止まってしまったことはありませんか?
SyntaxError: Non-UTF-8 code starting with '\x82' in file test.py on line 10, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details英語のメッセージに加え、\x82 や \xe3 といった謎の記号が表示されるため焦ってしまいますが、これはコードの記述ミスではなく、単純に「Python インタプリタがファイルの文字コードを読み間違えている」ことが原因です。
特に、スクリプトの中に日本語(コメントアウトや文字列)を含んでいる場合によく発生します。
- 【即対処】 コードの1行目に「おまじない」を書いてエラーを消す方法(マジックコメント)
- 【根本解決】 エディタの設定を見直し、ファイルを正しい形式(UTF-8)で保存し直す方法
- 原因の解説 エラーメッセージ内の謎の数字(
\x82)の正体とは?
【即対処】マジックコメントでエンコーディングを宣言する
最も手っ取り早い解決策は、スクリプトの冒頭(1行目または2行目)に、ファイルの文字コードを指定する「マジックコメント(エンコーディング宣言)」を記述することです。


これを書くことで、Python インタプリタは「あ、このファイルは UTF-8 じゃなくて Shift-JIS で書かれているんだな」と理解し、エラーを出さずに読み込んでくれるようになります。
基本の修正コード(Shift-JIS / CP932 の場合)
エラーメッセージに \x82 や \x93 といったコードが含まれている場合、そのファイルは Shift-JIS(または CP932) で保存されている可能性が高いです。
その場合、ファイルの先頭に以下の記述を追加してください。
# -*- coding: shift_jis -*-
print("これで日本語が含まれていてもエラーになりません")※ もし Shift-JIS で動かない場合は、Windows 固有の拡張文字に対応した cp932 を試してください。
# -*- coding: cp932 -*-エラーメッセージ内の「\x82」などは何を意味しているのか
エラーメッセージに出てくる Non-UTF-8 code starting with '\x82' という部分は、「UTF-8 だと思って読み始めたら、82 という UTF-8 には存在しないはずのデータ(バイト)がいきなり出てきたぞ!」 という Python からの悲鳴です。
\x82: これは16進数で82を表します。- 正体: Shift-JIS における日本語文字(漢字やひらがな)の1バイト目によく使われる数値です。



つまり、Python はデフォルトの「UTF-8」というメガネをかけてファイルを読もうとしましたが、Shift-JIS の文字コードが混ざっていたため、「読めない文字(\x82)がある!」と判断してエラー停止したのです。
【根本解決】ファイルを UTF-8 形式で保存し直す(推奨)
前章の「マジックコメント」は、あくまで「Shift-JIS のまま Python に読ませる」ための処置でした。 しかし、根本的にエラーを解決し、将来的な文字化けトラブルを防ぐには、スクリプトファイルの保存形式自体を UTF-8 に変換することを強く推奨します。
なぜ Python 3 では UTF-8 が標準なのか
Python 3 では、ソースコードのデフォルトエンコーディングが UTF-8 に定められています。 これは、世界中のあらゆる言語(日本語、英語、中国語など)や絵文字を、特別な設定なしで扱えるようにするためです。
つまり、ファイルを UTF-8 で保存さえしておけば、1行目のマジックコメント(# -*- coding: ...)は不要になり、コードがスッキリします。
エディタ(VS Code, メモ帳など)で文字コードを変換する手順
お使いのエディタで、ファイルの保存形式(エンコーディング)を「Shift-JIS」から「UTF-8」に変更して保存し直してください。
VS Code (Visual Studio Code) の場合
- ウィンドウ右下のステータスバーにある「Shift-JIS」(または CP932)をクリックします。
- 画面上部に出るメニューから「エンコード付きで保存(Save with Encoding)」を選択します。
- リストから「UTF-8」を選択して保存します。
Windows メモ帳の場合
- 「ファイル」メニュー > 「名前を付けて保存」を選択します。
- 保存ダイアログの下部にある「エンコード」のプルダウンメニューから「UTF-8」を選択します。
- 上書き保存します。
(unicode error) ‘utf-8’ codec can’t decode… が出る場合の対処
もし、あなたが「ファイルを UTF-8 に変換せず(Shift-JIS のまま)」、コードの1行目に # -*- coding: utf-8 -*- と書いてしまった場合、今度は以下のエラーが発生します。
SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x82 in position ...: invalid start byte- 原因
-
これは「看板に偽りあり」の状態です。
- 看板(1行目): 「このファイルは UTF-8 です!」と宣言している。
- 実態(ファイルの中身): Shift-JIS のデータ(
0x82など)が書かれている。
- 対策
-
このエラーが出たら、宣言に合わせてファイル自体を UTF-8 で保存し直してください。そうすれば宣言と実態が一致し、エラーは解消されます。
原因の解説:Python インタプリタはどうファイルを読んでいるか
なぜ Python は、たった1文字の日本語が入っただけでエラーを吐くのでしょうか。 それは、Python インタプリタがソースコードを「文字」ではなく「バイト(数値)の列」として読み込んでいるからです。
PEP 263 のルールとデフォルト設定
Python のソースコードの読み込みルールは、PEP 263 という仕様書で厳格に決められています。
- デフォルトは UTF-8
-
Python 3 では、エンコーディング宣言がない限り、すべてのファイルを UTF-8 として扱います。
- バイト列の解釈
-
インタプリタはファイルの先頭からバイトデータを読み込み、それを UTF-8 のルールに従って文字に変換しようとします。
- 不正なバイトの検出
-
ここで Shift-JIS 特有のバイトデータ(例:
0x82)が登場すると、UTF-8 のルールでは「ありえない数値」であるため、「解読不能(SyntaxError)」として処理を停止します。



つまり、エラーメッセージにある Non-UTF-8 code starting with '\x82' は、「UTF-8 のルールブックには 82 なんて始まり方は載っていないやん!」という Python からの抗議だったのです。
まとめ
本記事では、Python 実行時に発生する SyntaxError: Non-UTF-8 code... の原因と対策を解説しました。
- エラーの正体
-
ファイルが Shift-JIS 等で保存されているのに、Python が UTF-8 だと思って読もうとしたため発生する「読み間違い」
- 【推奨】根本解決
-
エディタの設定で、ファイルの保存形式を UTF-8 に変換する。これでマジックコメントも不要になり、最も安全
- 【即対処】暫定対応
-
ファイルの1行目に
# -*- coding: shift_jis -*-と記述し、Python に正しい文字コードを教える。
以上、最後までお読みいただきありがとうございました。


