LoginSignup
26
24

More than 5 years have passed since last update.

Python 3で日本語をprintする際のUnicodeEncodeErrorはLANGに気をつける

Posted at

サマリ

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です。

hello_ja.py
# 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
こんにちは世界
26
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
24