Help us understand the problem. What is going on with this article?

LANGやPYTHONIOENCODINGを設定してもUnicodeDecodeErrorが出る時の更なる確認ポイント

More than 3 years have passed since last update.

はじめに

私は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

です。経験上、この設定にしておくとあまり問題がおきませんでした。
それでもエラーが出るので悩んでいました

確認ポイント

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 ではデフォルトの設定なのでした。
つまり、余計な環境変数をセットしたことによってエラーを引き起こしていたというわけでした。。。

さいごに

雰囲気で環境変数をセットしてはいけないという悲しい例でした。

mokemokechicken
お気楽極楽会社員です。気ままに投稿しています。
sprocket
"Sprocket(スプロケット)は、Webサイトにおけるコンバージョン(購入・入会・資料請求・問合せ等)を増やしたい企業様向けに、自社開発のWeb接客ツールの導入及びコンバージョン改善コンサルティングを行っている会社です。 "
https://www.sprocket.bz/
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