SafariでRubricks検索テキストボックスの文字化け

rublogの新しいバージョンでRubricksの検索機能に対応したのですが、Safariでの検索が文字化けする事象があってせっかくなので調べてみました。

Rubrciksの検索には画面最上部のツールバーからの検索とRubricksHomeにある検索メニューからの検索の二種あって文字化けするのは検索メニューからの検索だけでツールバーからの検索はちゃんとできるんですね。とりあえずこのあたりをとっかかりにしてソースを追ってみるとツールバーからの検索は、オーソドックスなフォームなのに対し、メニューからの検索はなにやら難しげな感じでちょっと化石な僕には追い切れないところもあるのですが、以前コメントでも頂いたように、set_search_hash()で検索文字列をescape()してHashに登録しrubricks_search()でunescape()するというのが流れらしい。このescape() - unescape()の流れに文字化けの要因があるのは間違いなさそう。

そもそも、Safariの場合バグがあって文字化けを起こして[ajax] Safari の responseText で UTF-8 コード文字化け回避 Kawa.netブログ(川崎有亮)/ウェブリブログを参考にspinelz_util_for_rubricks.jsを修正しているのですが、このKawa.netさんの記事にブラウザ依存関数のescapeを逆手にとって使ってみました。とあってescape/unescapeはブラウザ依存だとするとこの部分を自前で実装するしかないわけですが、先の文字化け対策の中でデコードするのにはdecodeURIComponent()を使っています。つまりこっちはブラウザ依存でない!?ように思えます。で、もう少し調べてみたら、Core JavaScript 1.5 Guide:Predefined Functions:escape and unescape Functions - MDCにありました。

escape および unescape 関数は 非 ASCII 文字に対しては正しく機能せず、廃止予定になっています。JavaScript 1.5 以降では encodeURI、decodeURI、encodeURIComponent および decodeURIComponent を使用してください。

結局、IEやFFは非ASCII文字にも対応したけれどSafariは上記のとおりということでしょうか?そもそもescape/unescapeの「仕様」っていうのがハッキリしないし、仮にそんなものがあったとしても意図的に無視したりバグあったりするわけで結局はやってみるしかない。...ということで以下の対処をしてみました。

rubricks_search()   
   q_value  = decodeURIComponent(hash_list[0]);
    tc_value = decodeURIComponent(hash_list[1]);
    ti_value = decodeURIComponent(hash_list[2]);
set_search_hash()
    var hash = encodeURIComponent(q_value) + '&' + 
                        encodeURIComponent(tc_value) + '&' + 
                        encodeURIComponent(ti_value);

めでたく検索できました。Win(IE/FF)とMac(Safari/FF)でOKでした。それにしても、2バイト圏人は文字コードでいつも苦労しますね。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/138

返信