Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
24
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

サマリ

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
こんにちは世界
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
24
Help us understand the problem. What are the problem?