文字コードではまる
移転しました。
Djangoで生成するHTMLを、DBに格納しなければならなかった時に、文字コードではまったのでメモっておく。
環境はUbuntu8。たぶん
Django0.97-pre
以下のようなソースでHTMLをDBに格納しようとすると、
item = Item.objects.get(pk=id) t = loader.get_template(hoge.html') c = Context({ 'the_year':the_year, }) # DBにUPDATE item.html = t.render(c) item.save()
以下のようなエラー発生。
Traceback (most recent call last): File "hoge.py", line 47, in <module> update_flow_amc('1') File "hoge.py", line 42, in update_flow item.save() File "/usr/lib/python2.5/site-packages/django/db/models/base.py", line 272, in save self.save_base() File "/usr/lib/python2.5/site-packages/django/db/models/base.py", line 312, in save_base manager.filter(pk=pk_val)._update(values) File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line 311, in _update query.execute_sql(None) File "/usr/lib/python2.5/site-packages/django/db/models/sql/subqueries.py", line 112, in execute_sql super(UpdateQuery, self).execute_sql(result_type) File "/usr/lib/python2.5/site-packages/django/db/models/sql/query.py", line 1466, in execute_sql cursor.execute(sql, params) File "/usr/lib/python2.5/site-packages/django/db/backends/util.py", line 18, in execute return self.cursor.execute(sql, params) File "/var/lib/python-support/python2.5/MySQLdb/cursors.py", line 151, in execute query = query % db.literal(args) File "/var/lib/python-support/python2.5/MySQLdb/connections.py", line 247, in literal return self.escape(o, self.encoders) File "/var/lib/python-support/python2.5/MySQLdb/connections.py", line 180, in string_literal return db.string_literal(obj) UnicodeEncodeError: 'ascii' codec can't encode characters in position 474-475: ordinal not in range(128)
UnicodeEncodeError でググっていると、encode('utf-8')すると良いことがわかった。
なので、
item.html = t.render(c) ↓ item.html = t.render(c).encode('utf-8')
に変換したらおK!DBに格納できた。