『Python入門』日本語を扱う|文字化けやエラーの対処法

Python プログラミング Python

コメントに日本語を使いたい、print文で日本語を出力させたい、日本語を使うと文字化やエラーが発生する!っといった経験はありませんか?

この問題は、ソースコードで指定する文字コードか、ファイルの保存時に指定する文字コードを見直すことで解決ができます。

ここでは、Windows環境で文字コードとして「UTF-8」を指定して日本語を使う場合について解説していきます。

文字コードの指定

ソースコードの冒頭でこんなコメントを目にしたことがありませんか?

この記述をマジックコメントと呼びます

もしくは、「文字コード指定」、「エンコーディング指定」、「エンコーディング宣言」と呼んでも通じるかと思います。

これは、Pythonでプログラムをコーディングする際に文字コードを指定するために記述します。

上記の場合、このソースコードが「UTF-8」で書かれていることを宣言しています。


To define a source code encoding, a magic comment must be placed into the source files either as first or second line in the file, such as:

# coding=<encoding name>

PEP 263(Defining Python Source Code Encodings)より引用


Pythonで指定できる文字コードは以下に記載されています。
https://docs.python.org/ja/3.8/library/codecs.html#standard-encodings

 

Pythonのデフォルトの文字コード

マジックコメントは必ず記述するものではありません。

デフォルトで文字コードが決まっているので、それ以外の文字コードを指定したい場合にマジックコメントを記述します。

デフォルト文字コードはPythonのバージョンで異なり、以下のようになります。

Python2 ASCII
Python3 UTF-8

上記から、Python3の場合はデフォルトが「UTF-8」になるので、マジックコメントが記述されていなくとも、日本語を使うことが出来ます。

・・ん?じゃあなんでエラーになるのという方は、「文字コードの指定とファイル保存時の文字コードセット」を参照してください。

 

文字コードを指定する場合のルール

マジックコメントを記述する場合は、以下のルールで記述してください。

マジックコメントを記載する場合は1行目か2行目に記載。
Python2の場合は、デフォルトの文字コード(ASCII)以外を指定する場合は記述が必須。
Python3の場合は、デフォルトの文字コード(UTF-8)以外を指定する場合は記述が必須。
デフォルトの文字コードをマジックコメントとして記述することは推奨されない
 (Python3の場合、UTF-8を指定することを非推奨としています。)
マジックコメントの代表的なフォーマット
 # coding: utf-8
 # coding: UTF-8
 # coding=utf-8
 # -*- coding: utf-8 -*-(エディタにEmacsを使用している場合)
 # vim:fileencoding=utf-8(エディタにvimを使用している場合)

Emacs、vimユーザでなければ、上記のどれでも認識されます。

それは以下の正規表現にマッチしているためです。

coding[=:]\s*([-\w.]+)

なので、以下の書き方でも問題ないことになります。 

 

文字コードの指定とファイル保存時の文字コードセット

Pythonではバージョンごとにデフォルトの文字コードが決まっており、それ以外の文字コードを使用したい場合は、マジックコメントで指定しました。

それでも文字化けやエラーが発生するという現象があります。

それはファイルを保存するときの文字コードセットの指定が異なることがあるためです。

注意点として、文字コードの宣言と、実際のソースファイルの文字コードは一致させる必要があります

MacやCloud9などの環境では、デフォルトの「UTF-8」でソースファイルが作成されますが、Windowsの場合、エディターによっては「cp932」(Shift-JIS)で作成される場合があります。

メモ帳やサクラエディタなどのテキストエディタを利用している場合は、ファイルを保存する際に「名前を付けて保存」から「文字コードセット」に適切な文字コードを指定して保存してみましょう。

Python character code save -01

 

文字コードの指定で起こりうる主なエラー

ここでは文字コードの指定で発生しうるいくつかのエラーと解決方法を紹介します。

 

実際の文字コードがデフォルトの文字コードと異なるのに指定が無い

Python character code error -01

「SyntaxError: Non-UTF-8 code starting with '\x82' in file encoding_check.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details」

「UTF-8」以外の文字コードセットで保存されているけど、マジックコメントで文字コードが指定されていないよ!っと言っています。

マジックコメントを指定するか、ファイル保存時の文字コードセットを確認してみましょう。

 

実際の文字コードと指定した文字コードが異なる①

Python character code error -02

「SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte」

マジックコメントで文字コードを「UTF-8」に指定しているけど、「UTF-8」でデコードできないよ!っと言っています。

マジックコメントで指定している文字コードとファイル保存時の文字セットが一致していることを確認してみましょう。

 

実際の文字コードと指定した文字コードが異なる②

Python character code error -03

「SyntaxError: encoding problem: Shift-JIS」

「UTF-8」で保存したのにマジックコメントで「Shift-JIS」を指定している場合に発生します。

このように文字化けではなく、エラーが発生する場合もあります。

マジックコメントで指定している文字コードとファイル保存時の文字セットが一致していることを確認してみましょう。

 

PEP(PEP 8 と PEP 263)

PEP(Python Enhancement Proposal)は、Pythonの機能拡張の提案を表しています。

今回ソースコードの文字コードの指定については、PEP 8とPEP 263に詳細がありますので参考にして下さい。

PEP 263(Defining Python Source Code Encodings)

PEP 8 - Style Guide for Python Code(英語版)

PEP 8 - Python コードのスタイルガイド(日本語版)

 

タイトルとURLをコピーしました