Python
Bash
aws-cli

aws-cliの結果をリダイレクト/パイプしようと思ったときに文字化けするときの対策

More than 1 year has passed since last update.

こんな感じで、aws cliからコマンドをうつと、こんな感じになります(コマンド、出力はダミーです)。

$ aws s3 ls --recursive bucket/photo/1/
2014-05-06 16:45:30      11979 photo/1/20140506164529_スクリーンショット 2014-01-28 15.27.48.png

ところが、これにたとえば以下のようなコマンドに変えると、とたんに面倒くさいことになります。

$ aws s3 ls --recursive bucket/photo/1/ | tee /dev/null
2014-05-06 16:45:30      11979 photo/1/20140506164529_????????? 2014-01-28 15.27.48.pn

化けた!

なお、リダイレクトでファイル出力したときにも同じ現象が発生します。

対策

原因はawsコマンドを実装しているPython処理系にあります。Pythonは出力先に応じて文字コードを合わせてくれるのですが、リダイレクトやパイプの場合には、出力先の文字コードがわからないので、強制的にASCIIではき出してくれるのです!!! 余計なまねを!!!

対策としては、PYTHONIOENCODINGという環境変数・シェル変数を定義しておけばいいです。

$ PYTHONIOENCODING=UTF-8 aws s3 ls --recursive bucket/photo/1/ | tee /dev/null
2014-05-06 16:45:30      11979 photo/1/20140506164529_スクリーンショット 2014-01-28 15.27.48.png