safariでXMLHttpRequestをresponseTextで受け取った時の文字化けの対処法
結局、クイックハックなどどこ吹く風、CGIで粗成形したのをjsで表示、(同期だけど)裏側でリクエストをやり取りする、それなんてAjaxな作りになってきてしまった。それにしても、Ajaxでプログラム出来る人、とくにそれで飯を食ってる人はすごいな。ホントもうイライラして死にそう。CSSで、ブラウザ毎の見た目をそろえる仕事の方がまだ楽だ。さて、ちょっとググテみればわかるのだけれども、javaScript で XMLHttpRequest を発行した後、結果を responseText で受け取ると、Safariだと文字化けしてしまう。HTTPヘッダにもキャラセット入れるといいよ、と書いてあったけれども、どうもうまくいかない。色々な解決策が提示されていたけれども、基本に戻って、URIエスケープでのりきる簡単な方法をメモ。ただし、XMLHttpRequest を直にAPIに向かって投げているのではなく、間にPerlが入っているから出来る芸当だとも言える。話は単純1.XMLHttpRequest に向かってPerlから送られるデータを、エスケープする。具体的には、 $outPutData =~ s/([^?w ])/'%'.unpack('H2', $1)/eg;こんなかんじ。2.受け取り側のjsで、decodeURIComponent()を使ってアンエスケープする。 var inputData = decodeURIComponent(reqestObj.responseText);こんなかんじ。あれ? と思った君はスルドイ。XMLHttpRequest は application/x-www-form-urlencoded なんじゃないの? $outPutData =~ s/([^?w ])/'%'.unpack('H2', $1)/eg; $outPutData =~ tr/ /+/;が正しい形なんじゃないの?おいちゃんも実際の所はそうなんじゃないかと思うのだけれども、decodeURIComponent()は実際の所、+をスペースに置き換えてくれない。だから、2行目はいらない。いや、どう考えても application/x-www-form-urlencoded じゃないだろ、エスケープされないし。という意見の人もいると思う。ところが、safariだと、エスケープされてるような気がするんだよね…という所が、これからの課題。おんなじように送っても、IE7とsafariで挙動(送られているデータの状態)が違うというのが、また発狂しそう。