男の小遣い帳で、Ajaxでデータを取得したときにSafariで文字化けしていた。
自宅のサーバーでは動いていたからおかしいなーと思ってたんだけど、レスポンスヘッダのContent-Typeにcharset指定が無かったようだ。
自宅ではhttpd.confに
AddDefaultCharset UTF-8
と書いていたけど、共用サーバーでそんな設定はしないよな。
とりあえずDjangoからAjaxのレスポンスを返すときに
values = simplejson.dumps(data, ensure_ascii=False)
return HttpResponse(values, mimetype=”text/plain”)
となっていたのを以下に変更。
values = simplejson.dumps(data, ensure_ascii=False)
return HttpResponse(values, mimetype=”text/plain; charset=UTF-8″)
この対応で大丈夫か確認のため、一応Djangoのソースを見てみた。
HttpRequestクラスでは
def __init__(self, content='', mimetype=None):
from django.conf import settings
self._charset = settings.DEFAULT_CHARSET
if not mimetype:
mimetype = “%s; charset=%s” % (settings.DEFAULT_CONTENT_TYPE, settings.DEFAULT_CHARSET)
if not isinstance(content, basestring) and hasattr(content, ‘__iter__’):
self._container = content
self._is_string = False
else:
self._container = [content]
self._is_string = True
self.headers = {’Content-Type’: mimetype}
self.cookies = SimpleCookie()
self.status_code = 200
となっていて、mimetype指定があるときはそのままContent-Typeに突っ込んでいるので、charset指定も普通のヘッダのように書き足してOKっぽい。
mimetypeにcharsetが入っていなかったら、自動的にDEFAULT_CHARSETを追加してくれれば良いのに。HttpResponseにmimetypeを指定するときは、charsetも入れておいたほうが良さそう。
これでとりあえず動いたんだけど、どうやらSafariはそもそも文字化け問題を含んでいるらしい。
(恥ずかしながら知らなかった。)
古いSafariだとContent-Typeでちゃんとcharset指定してもダメなのかな?
とりあえずJavascriptも直しておこうというわけで、以下を参考に直した。
[ajax] Safari の responseText で UTF-8 コード文字化け回避 Kawa.netブログ(川崎有亮)/ウェブリブログ
最速インターフェース研究会 :: SafariのAjaxの文字化けをクライアント側だけで対応するバッドノウハウ
レスポンスヘッダでcharsetを返さなくても、この対応をすれば動作した。
サーバー側もJavascript側も対応して、とりあえず完了。
- Newer: vimperator入れてみた
- Older: 補足 画面遷移なしでファイルアップロードする方法
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://blog.joyfullife.jp/archives/2007/07/19152125.php/trackback
- Listed below are links to weblogs that reference
- Safariで文字化けでDjangoのHttpRequestのcharset指定などを見直す from 30からのBlog