※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】 ブログの右側部分の検索を、習作としてAjax化しています。
見た目きにせずに出力しているのはあれとして、simplejsonのdjangoラッパーが、日本語をord(s)したエスケープで返してきて困っています。
一応、jsonを返すビューで、ensure_ascii=False付きで呼び出しているのですが、値が使われることなくascii以外はordするエンコーダが選択されてしまいます。
results = Entry.objects.filter(Q(title__contains=keyword) | Q(body__contains=keyword)).order_by('-create_date')[:25]
data = ''
if len(results) > 0:
data = serializers.serialize('json', results, ensure_ascii=False)
return HttpResponse(data, mimetype='text/javascript; charset=utf-8')
simplejson自体の引数メモ書きをみると、ensure_ascii=Falseはエラーを引き起こすことがあると書いてあります。
Djangoはあえて、引数をわたさずにsimplejson.dumpを呼び出しているのかどうか、確認をとる必要がありそうです。
とりあえず日本語を含むオブジェクトをjson化するためには、上記コード+下記の修正が必要(KeyErrorは考慮していないので注意)。
django.core.serializers.json.py
- simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder)
+ simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder, ensure_ascii=self.options['ensure_ascii'])
ふーむ。どうしようかな。
trunk版は修正されています。上記ビビり修正ではなく **self.options を渡しているようです。いや、だって怖かったから・・ (2006-10-06)