はじめに
私はPythonを使い始めて10年以上経つのですが、未だにUnicodeDecodeError: 'ascii' codec can't decode
で1時間以上悩んでしまったので、その時のメモです。
直接の解決に至ったのは https://ota42y.com/blog/2015/06/03/linux_local/ のおかげでした。ありがとうございました。
Version
- Dockerの公式コンテナの
python:3.5.3
- OS: Debian GNU/Linux 8
- Python 3.5.3
UnicodeDecodeErrorが出た時の確認ポイント
症状
print(open("utf8.txt", "rt").read())
みたいなコードがあって、utf8.txt
にはUTF8のマルチバイトな文字があるとします。
UnicodeDecodeError: 'ascii' codec can't decode...
というエラーが出ます。
- 環境変数
- LANG:
ja_JP.UTF-8
- PYTHONIOENCODING:
utf-8
- LANG:
です。経験上、この設定にしておくとあまり問題がおきませんでした。
それでもエラーが出るので悩んでいました
確認ポイント
locale -a
を実行してみます。
Dockerの公式コンテナの python:3.5.3
では
C
C.UTF-8
POSIX
と表示されます。
そうです。ja_JP.UTF-8
がないのです。
そこで、 LANG=C.UTF-8
として再実行するとちゃんとエラーもなく処理されました。
しかも、LANG=C.UTF-8
は Dockerの公式コンテナの python:3.5.3
ではデフォルトの設定なのでした。
つまり、余計な環境変数をセットしたことによってエラーを引き起こしていたというわけでした。。。
さいごに
雰囲気で環境変数をセットしてはいけないという悲しい例でした。