Kawa.netブログ(川崎有亮)

アクセスカウンタ

help リーダーに追加 RSS [ajax] Safari の responseText で UTF-8 コード文字化け回避

<<   作成日時 : 2005/11/15 13:36   >>

トラックバック 12 / コメント 9

Safari の responseText では、Shift_JIS はおろか UTF-8 コードでも文字化けするため使いにくかったが、UTF-8 コードに対応する手順を考えた。

function get_response_text ( req ) {
var text = req.responseText;
if ( navigator.appVersion.indexOf( "KHTML" ) > -1 ) {
var esc = escape( text );
if ( esc.indexOf("%u") < 0 && esc.indexOf("%") > -1 ) {
text = decodeURIComponent( esc );
}
}
return text;
}
※2005/12/13 関数化した

実際のテキストファイルがUTF-8コードだったとしても、Safari 2.0のresponseTextはISO-8859-1コードか何かと誤認識したような文字列を返してくるので文字化けしてしまう。
そこで、ブラウザを判別して Safari ではいったんescapeで%HH形式に変換する。
このとき『UTF-8コードのエスケープ状態』と同じ文字列並びになっているから、これをさらにdecodeURIComponentで展開すればUTF-8コードの文字列として取り出すことができる!

※ブラウザ依存関数のescapeを逆手にとって使ってみました。

もっとも、さすがに Safari も今後のバージョンアップによってはちゃんと文字コードを認識するようになるだろうから、その時点では上記ルーチンで逆に文字化けが発生してしまうので、そのときにはバージョン番号で範囲特定などが必要になるけど、当面の間は、上記のif文を入れるだけでSafariでもUTF-8コードのテキストファイルを扱えるようになる!(⇒今後も副作用ないように書き換えました)

[参考]
http://jsgt.org/mt/archives/01/000287.html

設定テーマ

関連テーマ 一覧

月別リンク

トラックバック(12件)

タイトル (本文) ブログ名/日時
MovableType のサイト内検索を Ajax 化
 だいたいの MovableType を使った Blog に設置されて... ...続きを見る
AUSGANG SOFT
2005/12/26 09:52
Ajaxメモ2 - 文字コードについて
三位一体のからくりで、リッチな Web アプリを実現する Ajax。 HTML と JavaScript とサーバサイドスクリプトの文字コードの組み合わせはいかがなもんじゃろう? ということで、調査メ... ...続きを見る
お気楽極楽ブログ
2006/02/11 17:11
MTでAjax!!〜XMLHttpRequestでMTの各エントリーにメニューを読み込ませる〜
Road to me..では各エントリー、カテゴリー、マンスリーアーカイブにトップページと同じメニューを付けています。しかしながら過去のアーカイブは「すべて再構築」を実行するまでは「Recent Entries」などが古いままになっていまし... ...続きを見る
Road to me ...
2006/05/22 14:49
MTでAjax!!〜XMLHttpRequestでMTの各エントリーにメニューを読み込ませる〜
Road to me..では各エントリー、カテゴリー、マンスリーアーカイブにトップページと同じメニューを付けています。しかしながら過去のアーカイブは「すべて再構築」を実行するまでは「Recent Entries」などが古いままになっていまし... ...続きを見る
Road to me ...
2006/05/22 14:55
SafariのresponseText
Ajaxリクエストで返ってきたJSON文字列に日本語が含まれる場合にSafariが無限ループに陥る。 英語のみの場合は問題ないので、Contetnt-Typeが問題かと疑う。 サーバーサイドのプログラムで文字列エンコーディングがUTF-8であること、ヘッダーがきちんと設定されていることを ...続きを見る
そぶログ
2006/06/21 03:05
Safari1.2でresponseTextが文字化けする
responseTextだとsafari1.2で文字化けするので対処法を探していたところ [ajax] Safari の responseText で UTF-8 コード文字化け回避という非常に面白い記事を見つけました。ほかのブログではresponseXMLでないと文字化けするとの見解がほとんどでしたので、これは試す価.. ...続きを見る
開発中に色々あったことの備忘録
2006/07/03 01:53
ユーザー補助機能付リアルタイム郵便番号変換
巨大なデータを扱う機会が多くなってきたので、 データベースを導入することにしました。 ...続きを見る
ac-antenna
2006/10/27 23:37
DamMapsバージョンアップしました
DamMaps version1.0.2 http://www.dammaps.jp/ 今回のバージョンアップは…。 Safari文字化け対応 &#91;ajax&#93; Safari の responseText で UTF-8 コード文字化け回避 Kawa.netブログ(川崎有亮)/ウェブリブログを利用させていただきました。ありがとうございます。助か ...続きを見る
速報ダム日和
2007/01/18 23:25
Safariの文字化け問題
WordPressのアクセス解析プラグインである、Wp-SlimStat-Exというものを使っているのだが、どうしても肝心の部分がSafariで文字化けしてしまう。 Googleパーソナライズも同様の理由で、AJAXを使... ...続きを見る
My wonderful living
2007/06/27 21:25
Safariでdojoを使うと文字化けする件
こみゅすけは,dojoというライブラリをかなりの勢いで使用している。dojoは数... ...続きを見る
天使やカイザーと呼ばれて
2007/08/24 11:42
メモ:Safari の responseText で UTF-8 コード文字化け回避
Safari の responseText で UTF-8 コード文字化け回避 ...続きを見る
LOCK,STOCK
2007/12/24 16:47
Ajax?????????????????
?????^^ ??????????? Safari 3 ?????????????????????? ????????????? (?&???) Firefo... ...続きを見る
Movable Type ???
2008/02/22 21:04

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(9件)

内 容 ニックネーム/日時
文字化けが解消しました。
どうもありがとうございます!
大変感謝
2006/01/23 01:44
丁度プレーンテキストを扱った動的読込みでsafariの文字化けに悩まされていました。
有益な情報公開に感謝いたします。
ありがとうございました。
non
2006/06/29 17:20
同じ問題で悩んでいたので、助かりました。
prototype.js を改変して使ってみたところ、快適に動作してます。
ありがとうございます。
Psychs
2006/08/04 20:06
感動。助かりました。
cval
2007/03/04 19:59
SafariのUTF-8誤解釈に悩まされていました。
SafariのVerUPを期待していたため後回しにしていたのですが、
対応する様子がなかったため非常に参考になりました。
ありがとう御座います。
thomas
2007/06/27 21:42
最新版で文字化けが復活した模様です。
現在調査中です。
negi
2007/12/15 17:18
Safari3では、元のテキストのBOM有無で文字コード判定しているようですね。「BOMありならUTF-8」「BOM無しならISO-8859-1」というような挙動のようです。「BOMありUTF-8」のテキストなら、escape,decodeしないでもUTF-8として扱ってくれました。
anon
2008/02/17 20:44
Safari 3ではXMLHttpRequestで送信するファイルの拡張子でも、文字化けするしないが変わるようです。
Intel Mac版で確認した限りではhtml,htmはダメでtxt,xml,xhtmlはOK。極端な話拡張子なしでも化けませんでした。
加えて、escape()関数が吐き出すコードに"%u"が混じるようになったため、encodeURIComponentしたUTF-8と等価にならず、またif文にもひっかからず、変数textは不変のままです。
hyou
2008/02/29 22:11
文字化けに悩んでいたので助かりました。ありがとうございます!
ありがとうございました!
2008/03/28 00:02

コメントする help

ニックネーム
本 文

EDGE Now!