Posted at

【ubuntu】Pythonの標準出力で日本語出力が出来なかった話

More than 1 year has passed since last update.

Windowsで作成したpythonプログラムをubuntuで実行しようとしたときにはまった,文字コード関係のエラーについてまとめます.


エラーの内容

作業環境をWindowsからubuntuサーバに移行し,dockerを使ってpythonで書いたプログラムを実行する準備を進めていました.

コンテナを起動し,その中でプログラムを走らせたとき,次のエラーメッセージが表示されました.

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-24: ordinal not in range(128)

どうやらprint("")で日本語を表示させようとするときに発生しているようでした.

しかし,ubuntuインストール時には日本語版パッケージを利用したので,全く日本語が表示できていないわけではありません.catコマンドでは日本語のテキストファイルを表示できていました.


原因

コンテナ内のターミナルでecho $LANGを実行して環境変数$LANGを確認したところ,空になっていました.

コンテナの外では日本語版utf-8(ja_JP.UTF-8)が設定されていたため,気づくのに時間がかかってしまいました.


解決方法

locale -aコマンドを実行してja_JP.UTF-8があるかどうかを確かめます.

存在していなければ,apt-getでlanguage-pack-jaをインストール.

その後,$LANGにja_JP.UTF-8を追記する.

LC_ALLにja_JP.UTF-8を指定する.

これらのコマンドをまとめると以下のようになります.

$ apt-get update

$ apt-get install language-pack-ja
$ export LANG=$LANG=:ja_JP.UTF-8
$ LC_ALL = ja_JP.UTF-8

exportを使っているので暫定的な処置にはなっていますが,ひとまずこれで標準出力で日本語を表示することに成功しました.

環境変数$LANGの設定だけでなく,LC_ALLの設定も必要でした.

pythonのターミナルがlocaleの設定ファイルを参照していて,その設定が適切でなかったために起きてしまったようです.具体的にどのlocaleを参照しているのか,時間があるときに調べたいです.