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を参照しているのか,時間があるときに調べたいです.