予定通り(?)の続報です(笑)
前回の最後で、python単体とCGIとしての動作が違うと書きましたが、それも回避に成功しました。
問題点を整理すると、
・python単体では全てutf-8で処理できて、file書き出しも画面出力も問題なし
・CGIとして実行すると、あの有名な Encode Decode Error が出る
というもの。
どうも単体での実行とCGIとしての実行で、文字コードの扱いが変わるようですね。
CGIとして実行した場合、日本語出力の部分で、ASCIIでやってみたけど変換できひんやろが!とエラーを吐くので、
'日本語部分'.encode('utf-8')
として出力すると、エラーを出さなくなりました。
しかし、画面には日本語ではなく見慣れない文字列が・・・
ん゛ーなんじゃこら。
と小一時間四苦八苦してると、バイト列ということに気付きました。
よくよく調べてみると、python2系とpython3系でencodeの扱いが変わり、python2系ではunicodeから指定する文字コードの文字列への変換だったのが、python3系では指定する文字コードのバイト列への変換に変わったようです。
なので出力がバイト列になってしまう。
この辺りは、検索しても解説しているページが少なかったですね。
なので、なんでバイト列に変換されんねん、と訳も解らず、ハマりました(^^;)
回避方法は、
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
の一文を入れること。
sys.stdout(システムの標準出力=画面)をutf-8でラップしてしまいますよ、という設定。
これで出力が自動的にutf-8の文字コードになります。
ざっと、日本語扱う時はこれ入れとけばいいよ、と書いているサイトはいくつかあったんですが、個人的には、そういうのは対象のみに絞って変えたいってのがあって、標準出力の設定を一括で変えてしまうことは躊躇してました。
でも、バイト列ですべて処理するといった他の回避方法は非常にややこしそうだったので、最終的には導入することに。
これでオールクリア。
無事、CGIとして動くようになりました。
色々と調べてもややこしかったpythonですが、python2系とpython3系は明確に分けて検索したほうが素人にはいいですね。
混乱の原因になります。
それぐらい下調べしてから始めろよ、という話でもあるんですが(^^;)
検索した感じでは、まだ2系の解説ページの方がちょっと多いかな。
3系をやろうと思ってる人には、要注意事項です。
でも、ハマッたお陰でpythonの理解はちょっと深まったでしょう!
でないと浮かばれない・・・
あと、検索して一番の収穫は、
忘備録って間違い発祥の単語だったこと!
備忘録の間違いかららしいです。
辞書にも載ってるぐらい市民権を得てますがね。
そら変換できんわな(笑)
前回、堂々と忘備録と書いた気がしますが、スクリプト動作記念にそのままで(^^;)
0 件のコメント:
コメントを投稿