Python3の文字コードについて


情報系の備忘録的なのを書こうかと思い、投稿してみた。

…が、書き途中で他の仕事やり始めてしまったので、とりあえず未完成品を投稿。
余裕がある時にコードとか追加しようかな…。

はじめに

今回は、Python3の文字コードについてまとめておこうと思う。

最近、他のサイトのデータを持ってきて、整形する作業をやってみたが、
requestで持ってくるときや、ファイル書き込みするときにErrorや文字化けが…。

色々サイトを漁ってもよくわからなかったので、詳しい人に聞いてみました。
以外とスッキリした気がするので、ここに書いておこうと思う。

文字コードとは

まず文字コードとは何ぞやという人もいると思い、簡単に書いてみる。

端的に言うと、

文字1つに対して、1つの2進数が割り振られているもの

だと思います…。

ある文字に対して、1つの通し番号が割り振られており、
その通し番号で、どの文字に変換するかを決めたもの。

Python3の文字コードは??

では、Python3の文字コードは何が使われているのか。

全体を図にするとこんな感じ。

これを1つずつ説明していく。

Python3の文字について

Python3内の変数などに格納される文字は、Unicode

PythonConsole
>>>'あ' == u'\u3042'
True

Python2だとstring型とか色々あったらしいが、
少なくともPython3の文字はこれで統一されているみたい。

.pyファイルの文字コード

Pythonのコードが書かれたファイルはUTF-8で書かれている。

試しに以下のようなファイルを作成して

test_python_file.py
test = "こんにちは世界"

WindowsのConsole(Shift-jis)で出力してみると

console(Windows)
>type test_python_file.py
test = "縺薙s縺ォ縺。縺ッ荳也阜"

.pyのファイルはUTF-8で書かれているため、もちろん文字化けする

Pythonのプログラムで作成された.txtファイルなど

これについては、ちょっと複雑。

使っている環境(OS)で異なるみたい。

Windows -> Shift-jis
Mac, Linux -> UTF-8

まとめ

全体的に言いたいことは、以下の通り。

環境 文字コード
Python3の文字 Unicode
.pyファイルのコード UTF-8
出力ファイルなど Windows : Shift-jis, Mac&Linux : UTF-8 (環境に依存)

この内部構造が分かっていると、文字コードのErrorとかも対処しやすそう…。

間違ってたら教えてくださるとありがたい!