エンコード関連ではまったので共有しておきます。
ベースとなるコード
日本語の部分がユニコード文字列になっていないのが不安ですが、動作します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/usr/bin/env python # -*- coding: utf-8 -*- from google.appengine.ext import webapp from google.appengine.ext.webapp import util class MainHandler(webapp.RequestHandler): def get(self): self.response.out.write('はろーわーるど') self.response.out.write('Hello world!') def main(): application = webapp.WSGIApplication([('/', MainHandler)], debug=True) util.run_wsgi_app(application) if __name__ == '__main__': main() |
動かないコード
MainHandler内のHello World!をUnicode文字列に変えた所、エラーが発生しました。
1 2 3 4 | class MainHandler(webapp.RequestHandler): def get(self): self.response.out.write('はろーわーるど') self.response.out.write(u'Hello world!') |
発生したエラー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | Traceback (most recent call last): File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3245, in _HandleRequest self._Dispatch(dispatcher, self.rfile, outfile, env_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3186, in _Dispatch base_env_dict=env_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 531, in Dispatch base_env_dict=base_env_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2410, in Dispatch self._module_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2320, in ExecuteCGI reset_modules = exec_script(handler_path, cgi_path, hook) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2216, in ExecuteOrImportScript exec module_code in script_module.__dict__ File "C:\Users\realbasic\Desktop\gae\trunk\donotmix\main.py", line 18, in <module> main() File "C:\Users\realbasic\Desktop\gae\trunk\donotmix\main.py", line 15, in main util.run_wsgi_app(application) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\util.py", line 97, in run_wsgi_app run_bare_wsgi_app(add_wsgi_middleware(application)) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\util.py", line 115, in run_bare_wsgi_app result = application(env, _start_response) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 535, in __call__ response.wsgi_write(start_response) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 248, in wsgi_write body = self.out.getvalue() File "C:\Python25\lib\StringIO.py", line 270, in getvalue self.buf += ''.join(self.buflist) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128) |
両方Unicode文字列
両方ともUnicode文字列にすれば問題なく動作します。
1 2 3 4 | class MainHandler(webapp.RequestHandler): def get(self): self.response.out.write(u'はろーわーるど') self.response.out.write(u'Hello world!') |
日本語だけUnicode
日本語だけUnicodeの場合も動作します。
1 2 3 4 | class MainHandler(webapp.RequestHandler): def get(self): self.response.out.write(u'はろーわーるど') self.response.out.write('Hello world!') |
結論
日本語を少しでも使いたいとおもったら、すべての文字列はUnicode文字列にすべき。
- すべてUnicode文字列
問題なく動作する。こうするべき。1
2self.response.out.write(u'はろーわーるど')
self.response.out.write(u'Hello world!') - すべてstr型
一応、動作しているようだが、マルチバイト文字の取り扱いに難あり。1
2self.response.out.write('はろーわーるど')
self.response.out.write('Hello world!') - Unicode文字列とStr型を混用
エラーが発生する場合があり危険
動作する例1
2self.response.out.write(u'はろーわーるど')
self.response.out.write('Hello world!')動作しない例
1
2self.response.out.write('はろーわーるど')
self.response.out.write(u'Hello world!')