#freeze
 #setlinebreak(on)
 * PEAR::HTML_AJAX 日本語POST対応 Javascript版escape用 unescape関数 [#s35d9c7d]
 * 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 '';
  }
  ?>
 
 試しに日本語も使ってみたが、
 全然問題なくいけた。
 
 
 
 
 
 
 
 
 
 
 
 
 #comment


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