【Python】SyntaxError: Non-UTF-8 code starting with の原因と解決策

  • URLをコピーしました!
目次

はじめに

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) の場合

  1. ウィンドウ右下のステータスバーにある「Shift-JIS」(または CP932)をクリックします。
  2. 画面上部に出るメニューから「エンコード付きで保存(Save with Encoding)」を選択します。
  3. リストから「UTF-8」を選択して保存します。

Windows メモ帳の場合

  1. 「ファイル」メニュー > 「名前を付けて保存」を選択します。
  2. 保存ダイアログの下部にある「エンコード」のプルダウンメニューから「UTF-8」を選択します。
  3. 上書き保存します。

(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 に正しい文字コードを教える。

以上、最後までお読みいただきありがとうございました。

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

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次