카테고리 보관물: Programming

Jinja2의 UnicodeDecodeError

App engine을 이용하는 project 중에 Jinja2 template 부분에서 다음과 같이 UnicodeDecodeError가 발생하는 문제가 생겼다.

Traceback (most recent call last):
  File "<<APP_ENGINE>>/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "<<APP_ENGINE>>/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "<<APP_ENGINE>>/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)J
  File "<<APP_ENGINE>>/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "<<APP_ENGINE>>/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "<<APP_ENGINE>>/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "<<PROJECT_TOP>>/main.py", line 141, in get
    r = t.render(events)
  File "<<APP_ENGINE>>/lib/jinja2-2.6/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "<<PROJECT_TOP>>/templates/parser.html", line 21, in top-level template code
    <td>{{titles[loop.index0]}}</td>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 9: ordinal not in range(128)

Jinja2 web page의 설명문서에 따르면, Jinja2는 내부적으로 Unicode를 사용하기 때문에 template에는 unicode object를 넘겨주어야 한다고 설명하고 있는데, 내가 project에서 사용하는 web page는  cp949 encoding을 사용하기 때문에 문제가 발생한다.

따라서 이것은 Jinja2 template으로 data를 넘기기 전에 unicode()를 이용해서 cpc949를 uinicode로 변환한 값을 넘겨주면 해결할 수 있다. 다음은 실제로 수정된 code로 cp949로 encoding된 문자열을  unicode로 변환해서 추가하는 것이다.

titles.append(sch.mTitle) -> titles.append(unicode(sch.mTitle, 'cp949'))