2005-03-10
Safari の XMLHttpRequest
Safari では Google サジェスト で日本語が文字化けしていた(改善されている)。これに限らず Ajax のサンプルで文字化けすることが多い。原因は JavaScript の XMLHttpRequest にある。具体的には、responseText の返り値が文字化けしている。Google サジェスト では XML ではなくただのテキストをやりとりしている。Safari ではデータの内容が XML ではないテキストだと responseText が文字化けしてしまう。この内容が XML であれば化けない。
XMLHttpRequest て名前なんだから XML で渡すべきなのかもしれないが、XML を渡して JavaScript 側でパースするより、扱いやすいデータで渡した方が実装が楽だったり負荷が軽かったりする場合もある。Google サジェスト はスクリプトコードを受け渡していて、そのまま eval しているようだ。
ひさしぶりに WebCore のソースを見る。JavaScriptCore ではなく WebCore の方で実装されていて、ファイルは /khtml/ecma/xmlhttprequest.cpp。エンコーディングに関する箇所に「FIXME」コメントがあるのでここか? でも XML では化けないから一応ちゃんと設定されてはいるのかな? ていうか暇が無い。また今度。
ちなみにアマゾン検索サイドバー(日本語が検索できなかったぽいのを修正) は HTML を受け渡しているのだが、この文字化けを回避するために、要素が1個の XML に包んで渡すようにしている。
追記:2005-08-06
Google サジェストは化けなくなってますね。
3 Trackbacks 現在、受付は中止しています
Googleサジェスト--Safariで文字化け
Googleサジェスト(ベータ版)を使ってみました。キーワードを入力していくと、
【Ajax】responseされる文字コードの調査
予想通り、ブラウザバージョンごとの違いが結構あるので、 とりあえず、対策うんぬんを考える前に 問題点を洗い出して確定しておこうと思います。 まず、responseTextで受け取るファイルの文字コードによる、 ブラウザバージョンごとの振る舞いの違いです。 文字コード関連調
[ajax] Safari の responseText で UTF-8 コード文字化け回避
Safari の responseText では、Shift_JIS はおろか UTF-8 コードでも文字化けするため使いにくかったが、UTF-8 コードに対応する手順を考えた。
2 Comments
日本語の入出力
やり取りするデータがXMLでないことと文字化けとは関係はないようです。
文字コードの問題ではないかと思います。
ちょっとだけ癖があるので最初は戸惑います。
ここのコードなんか参考になると思います。
http://tokuhirom.dnsalias.org/~tokuhirom/cl/2005-02-26-1.html
以下のサイトでもXMLは使用されていません。
http://tokuhirom.dnsalias.org/~tokuhirom/wpsearch/
From : ななしさん @ 2005-03-12 13:09:01 編集
Re: 日本語の入出力
これは Safari(WebKit)に限った問題で、XML かどうかとは関係ないことの証左、
つまり「非XML - 化けない」と「XML - 化ける」例がまだ出て来ていないんです。
示されたふたつのサイトは、Safari ではいずれも「非XML - 化ける」でした。
--
gdb で追ってみると、どうもエンコーディングの取得ができてない予感。
private 変数(QString encoding)に値を代入してない気がする。
From : ヘチマ @ 2005-03-13 08:58:12 編集