1001001

73。CTFのWrite-upや技術的な備忘録を書きとめたいです。

【Raspbian】Python3でのUnicodeEncodeErrorの解決

別環境で作成したPython3プログラムをRaspbian上で動かそうとしたらUnicodeEncodeErrorが出てしまったので,その対処法を記載.

TL;DR

Debian環境の場合.

$ sudo apt-get install task-japanese
$ sudo vim /etc/locale.gen
ja_JP.UTF-8の行のコメントを解除
$ sudo locale-gen
$ sudo update-locale LANG=ja_JP.UTF-8

以下を参考にしています.Ubuntu環境の場合の対処もあります.
Debian/Ubuntuのデフォルトロケールを変更する - Qiita

現象

日本語を印字する処理で以下のエラーが発生.

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

Python3環境では,Python2のように日本語文字列に'u'をつけなくてもデフォルトでUnicode扱いになるので,何が悪いのかよくわからなかった.

原因

デフォルトロケールが原因でした.Python3の文字コード選択はLANGを参考にしているらしいです.
Python 3で日本語をprintする際のUnicodeEncodeErrorはLANGに気をつける - Qiita

ここで,上記リンク先のようにexportでLANGの値が確認できますが,仮にLANG=ja_JP.UTF-8となっていてもダメなことがあるようです.
例えばOSがUbuntuなら,Ubuntuインストール時に英語を選択していたりするときちんと日本語に対応できないということになるみたいです.
私の場合は,Raspbianのデフォルトロケールの設定をしておらず,上のような状況に陥っていました.

対処

以下のようにします.Debian環境ならRaspbianでなくともこれでいけると思います.

$ sudo apt-get install task-japanese
$ sudo vim /etc/locale.gen
ja_JP.UTF-8の行のコメントを解除.私の場合は283行目でした.
$ sudo locale-gen
$ sudo update-locale LANG=ja_JP.UTF-8

設定後に実行すると正常に動作しました.