サマリ
Python3でUnicodeEncodeErrorが起きたときには
- LANG=ja_JP.UTF-8 と環境変数が設定されているか確認する
- language-pack-ja がインストールされているか確認する
現象
今まで7年ほどPython 2系を使ってきましたが、そろそろ3系に移ろうと思っています。
Python3では、文字列まわりがUnicodeに統一されて、便利になったと聞いていたのですが、UnicodeEncodeErrorでつまづきました。
OSはUbuntu 14.04.4 LTSでPythonはpyenvで入れた3.5.2です。
実行したコードは下記のHello Worldです。
# coding: utf-8
print("こんにちは世界")
結果
% python hello_ja.py
Traceback (most recent call last):
File "sample.py", line 4, in <module>
print("\u3053\u3093\u306b\u3061\u306f\u4e16\u754c")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
Python2系だと、codecsを使って一手間かける必要がありましたが、3系ではこれでいけるはずですが…
対策
備忘録 - #python3 で sys.std(in|out|err) の encoding を強制する
を読んでみると、Python3系の文字コード選択では、どうやら環境変数のLANGを見ている様子。
環境変数を確認すると、日本語utf-8になっていました。
% export | grep LANG
LANG=ja_JP.UTF-8
LANG=Cになっていたら、これが原因だったのですが、今回は違ったようです。
基本に立ち返って、日本語環境がそもそもインストールされているのか確認したところlanguage-pack-jaがインストールされていませんでした。英語版のイメージでインストールしていたので、入れ忘れていたようです。
Debian/Ubuntuのデフォルトロケールを変更するに従ってパッケージのインストールと、デフォルトロケールの設定をします。
% sudo apt-get install language-pack-ja
% sudo update-locale LANG=ja_JP.UTF-8
これで、正しく日本語をprintできるようになりました。
% python hello_ja.py
こんにちは世界