六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

Python3とUNICODE

Python3はインタプリタ内部はUNICODEベースであるが入出力がUNICODEとは限らない。コンソール出力はデフォルトでは環境依存で、私の環境(XAMPP付属のApacheの上で動作)ではShift-JISエンコードで表示される。なので、次のようなコードを書くとエラーになる。

print('cafe')

'cp932' codec can't encode character '\xe9' in position 3: illegal multibyte sequence

おフランス語の文字が解釈できませんと言われた。これを防ぐには、次の呪文を唱えるといいらしい。

import io,sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

入出力をutf-8で行いますよ、という意味だ。うまくいかずしばらくハマっていた。なお、これだけではファイル出力をutf-8にできないので、ファイルオープン時にエンコーディングutf-8を明示指定する必要がある。
参考リンク:
[python3]デフォルト文字コードの指定(CGI実行時) | 「きまぐれほげほげひろば」のTOPICS
Python3スクリプトをCGIとして動かすときの文字エンコード指定 | Cross Points
2つ目は環境変数utf-8に変えてしまう根本修正だが、例えばレンタルサーバーでこの手は使えるのだろうか?
PHPでもUNICODE周りで面倒な思いをした記憶がある。UNICODEは便利で思想も素晴らしいが、実装する人間にとっては悩みの種だ。