エンコードエラー

日曜日, 2月 20th, 2011 by

エンコード関連ではまったので共有しておきます。

ベースとなるコード

日本語の部分がユニコード文字列になっていないのが不安ですが、動作します。

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
    2
    self.response.out.write(u'はろーわーるど')
    self.response.out.write(u'Hello world!')
  • すべてstr型
    一応、動作しているようだが、マルチバイト文字の取り扱いに難あり。

    1
    2
    self.response.out.write('はろーわーるど')
    self.response.out.write('Hello world!')
  • Unicode文字列とStr型を混用
    エラーが発生する場合があり危険
    動作する例

    1
    2
    self.response.out.write(u'はろーわーるど')
    self.response.out.write('Hello world!')

    動作しない例

    1
    2
    self.response.out.write('はろーわーるど')
    self.response.out.write(u'Hello world!')

Facebook comments:

comments

Leave a Reply


Get Adobe Flash player
single