#freeze
#setlinebreak(on)
* unescape(PHP)関数 Javascript版escape日本語POST対応  PEAR::HTML_AJAX   [#s35d9c7d]
#htmlinsert(googleAdsense.html)
#ref(http://dozo.rgr.jp/img/img20_file.png,right,nolink,around,PHP::PEAR)

AJAX、いやXML通信XMLHttpRequestは、
原則文字コードがunicode(UTF-8)で行われる。
日本語も例に漏れずunicode。

前回の記事
[[HTML_AJAXでGET,POSTリクエスト>PEAR/HTML_AJAX/GET_POST]]
でポスト(ゲット)リクエストを行った場合、
日本語は自動的にUnicodeに変換される。
ただ、そのまま使うとhttpインジェクションが起こるので、
なんらかのescape処理が行われる。

JavaScriptにはescapeという(PHPでいうurlencode)関数があって、
これを通すことで安全にリクエストを行うことが出来る。


ただ、このescape関数。
少し厄介な点がある。

理由はブラウザによって動作が異なること、
そしてPHPで復元(decode)する関数がないことだ。
はて、困った。
( ̄-  ̄ ) ウーン


そこはそれ、
捨てる神あれば拾う神ありってやつで、
世界中のエンジニアはだいたい同じ事を考える。

PHPのマニュアルのutf8_encode関数ページ
http://jp2.php.net/utf8_encode
のコメントでJavaScriptのescapeを復元してくれる関数を作った人がいる。
(O_o)WAO!!!

ソースはこんな感じ
 <?php
 /**
  * Function converts an Javascript escaped string back into a string with specified charset (default is UTF-8). 
  * Modified function from http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps
  *
  * @param string $source escaped with Javascript's escape() function
  * @param string $iconv_to destination character set will be used as second paramether in the iconv function. Default is UTF-8.
  * @return string 
  */
 function unescape($source, $iconv_to = 'UTF-8') {
   $decodedStr = '';
   $pos = 0;
   $len = strlen ($source);
   while ($pos < $len) {
       $charAt = substr ($source, $pos, 1);
       if ($charAt == '%') {
           $pos++;
           $charAt = substr ($source, $pos, 1);
           if ($charAt == 'u') {
               // we got a unicode character
               $pos++;
               $unicodeHexVal = substr ($source, $pos, 4);
               $unicode = hexdec ($unicodeHexVal);
               $decodedStr .= code2utf($unicode);
               $pos += 4;
           }
           else {
               // we have an escaped ascii character
               $hexVal = substr ($source, $pos, 2);
               $decodedStr .= chr (hexdec ($hexVal));
               $pos += 2;
           }
       }
       else {
           $decodedStr .= $charAt;
           $pos++;
       }
   }
 
   if ($iconv_to != "UTF-8") {
       $decodedStr = iconv("UTF-8", $iconv_to, $decodedStr);
   }
   
   return $decodedStr;
 }
 
 /**
  * Function coverts number of utf char into that character.
  * Function taken from: http://sk2.php.net/manual/en/function.utf8-encode.php#49336
  *
  * @param int $num
  * @return utf8char
  */
 function code2utf($num){
   if($num<128)return chr($num);
   if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
   if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
   if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
   return '';
 }
 ?>

試しに日本語も使ってみたが、
全然問題なくいけた。
-おー、すばらしいUnicodeのescape戻し関数。Good Job!おかげで、徹夜が避けれそう!Thanks! -- [[teru]] &new{2006-08-31 04:55:20 (木)};
-遅くまでお疲れ様でした。 -- [[dozo]] &new{2006-09-02 01:50:17 (土)};
-年度 -- [[年度]] &new{2007-04-02 14:49:43 (月)};
-日本茶 -- [[煎茶 花子]] &new{2007-04-02 18:07:46 (月)};
-ありがたやー! -- [[美知太郎]] &new{2007-04-12 16:20:32 (木)};

#comment


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Third Project
証券会社ランキング比較