unicode型だったら、自動的にエンコードして出力するメソッドを作った
Pythonを使ったCGIを作るに際して、プログラムの内部ではunicode型を使い、出力時にはUTF-8に変換するということをしているのですが、今まではWebで検索して見付けたやりかた:
sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)
を使っていました(See also d:id:imait:20090203:1233673369)。
ですが、もし将来的に画像などのデータをCGI経由で出力したくなったりした時に、これでは困るのではないだろうか、そういう懸念がありまして、なんとかしたいと思ってきました。なので、なんとかしてみました。
どのようにしたかというと、HTMLクラスに新しくメソッドを用意しました。
def printe(self, value): if isinstance(value, unicode): print(value.encode(self.encode)) else: print(value)
エンコードしてプリントするのでprinteメソッド。やることは非常に単純で、わたされたデータがunicode型なら、HTMLクラスのインスタンスを生成する際に指定した文字コードでエンコードしてprint、その他の型ならそのままprint。printeメソッドを使うことで、出力時の文字コード云々を意識しなくてすむようになる。なるかな?
これをクラスメソッドにしなかったのは、いったいどの文字コードにエンコードするか、いちいち指定しないといけなくなるから。だったら、こんな七面倒くさいことせずに、素直にエンコードしてやったほうがいい。
value = u'テスト' print(value.encode('utf-8'))
これだと、なにやってるか一目でわかります。けど、これを少ない手数で書きたいと思ったから、printeメソッドを作った。
import html sitetitele = u'サイトタイトル' ht = html.HTML(encode=u'utf-8', lang=u'ja', sitetitle=sitetitle) value = u'テスト' ht.printe(value)
きっとたくさんprintすることになるから、この方がいいかな、なんて思うんですね。