どうもおはようございます、、、、。今パイソンでcgi作ろうと頑張ってるのですが、ほぼ丸一日を文字コードに苦しめられました...。昔pythonを使ってプログラムしたときも、標準入出力とか、ファイルに出力する際に、いろいろ文字化けして苦しんだ記憶がありますが。cgiでもう一度もだえ苦しむことになるとは思ってませんでした...。
結果を言うと標準出力のエンコードを指定すればいいみたいです。
症例
print(“Hello, World!”)は出力できるが、
print(“こんにちは”) を出力しようとすると
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-4: ordinal not in range(128)
がエラーログに出力されてしまいます。
ためしに様々なエンコードを出力しようと試してみますと、
codes=['utf-8','cp932','shift-jis','euc-jp','ascii'] for code in codes: try: print("こんにちは".encode(code),end="<br/>") except: print("can't encode",end="<br/>")
asciiではcan’t encodeが表示され、その他では意味不明なバイト列が表示されます。
対策
そこで標準出力先のエンコードを変えようとしていたのですが、ここで躓きました...。
sys.stdout.setdefautencoding(‘utf-8’)
sys.stdout = codecs.getwriter(‘utf-8’)(sys.stdout)
ググってみると大体この二つが解決策として表示されるのですが、実際にやってみると、他のエラーが出力されてしまいます...。
根気よくググってると、実はこれが通用するのはpython2.6以前のバージョンらしい...。
えええええええええ
とりあえず、python3.5では次の書き方をしないといけないようです。
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=’utf-8′)
感想
えと、答えを見つけ出す要領が悪いためにいろいろ手こずってしまいましたが、もし同じように困ってる人がいれば、このページにたどり着いていただければと思います...。

コメントを残す