urldecode就可以了
不过需要注意的是js的EncodeURI是采用utf-8编码的,你可能还需要做一次编码转换

解决方案 »

  1.   

    一天到晚都是唠叨你一个答我的问题啊,也答得很详细的,感谢了。其实我的目的就是为php 对 JS encode 的 decoder 而来。不过我还是不懂你的意思,
    例如下边的:
    <script language = JScript.Encode>#@~^GwAAAA==[Km;s+ YRSDbO+vJ4+^VGS你好。r#jQgAAA==^#~@</script>
    通过浏览器解释后是:"hello,你好。"
    我就是想要浏览器对js encode的php解释方法。
      

  2.   

    <script language = JScript.Encode>原来你是指这个呀!过两天找出反编译的c代码给你看看,改写成php的应该没有问题的
      

  3.   

    一天到晚都是老大一个人答,且答得很详细,谢谢了。其实我刚才问的问题都是为php里对js encode 的decoder而来的。
    上边你的答复我还是不明白,我再说一下:
    例如:
    <script language = JScript.Encode>#@~^GwAAAA==[Km;s+ YRSDbO+vJ4+^VGS你好。r#jQgAAA==^#~@</script>
    浏览器解释后:
    hello,你好。我就是想把那些字符串由php来解释。谢谢。
      

  4.   

    不好意思,我的机器缓冲区出了问题,重复回复了。
    是的,我在网上找到两分资料,一份是js 解释的,一分是 c 解释的。
    但我从人家的 js 里改过来却发现有些地方有问题的,例如 js 的 substr 函数和 php里的不同,例如如果它取1个中文字,会把整个中文字提取过来的。js 的 charCodeAt 也不对应php 的 ord 函数,这个 charCodeAt 问题就更大了,就是我刚才在 js 版里问的问题了。不过 js 转php 的我就差这两个函数没处理好。其他都处理好了,要不要我把完整的都发过来?
      

  5.   

    这个是网上的js原型:
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <meta name="ProgId" content="FrontPage.Editor.Document">
    <title>Welcome</title>
    </head>
    <SCRIPT language=javascript>
    <!--
    function screncode(s,l)
    {enc=new ActiveXObject("Scripting.Encoder");
    return enc.EncodeScriptFile("."+l,s,0,l+"cript");
    }
    var STATE_COPY_INPUT = 100
    var STATE_READLEN = 101
    var STATE_DECODE = 102
    var STATE_UNESCAPE = 103var pick_encoding = new Array(
    1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
    1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
    1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
    1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
    )var rawData = new Array(
    0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
    0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
    0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
    0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
    0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
    0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
    0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
    0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
    0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
    0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
    0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
    0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
    0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
    0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
    0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
    0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
    0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
    0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
    0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
    0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
    0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
    0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
    0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
    0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F
    )var transformed = new Array()
    for (var i=0; i<3; i++) transformed[i] = new Array()
    for (var i=31; i<=126; i++) for (var j=0; j<3; j++) transformed[j][rawData[(i-31) * 3 + j]] = (i==31) ? 9 : ivar digits = new Array()
    for (var i=0; i<26; i++)
    {
    digits["A".charCodeAt(0)+i] = i
    digits["a".charCodeAt(0)+i] = i+26
    }
    for (var i=0; i<10; i++) digits["0".charCodeAt(0)+i] = i+52
    digits[0x2b] = 62
    digits[0x2f] = 63function unescape(char)
    {
    var escapes = "#&!*$"
    var escaped = "\r\n<>@"
    if (char.charCodeAt(0) > 126) ret = char
    else if (escapes.indexOf(char) != -1) ret = escaped.substr(escapes.indexOf(char), 1)
    else ret = "?"return ret
    }function decodeBase64(string)
    {
    var val = 0
    val += (digits[string.substr(0,1).charCodeAt(0)] << 2)
    val += (digits[string.substr(1,1).charCodeAt(0)] >> 4)
    val += (digits[string.substr(1,1).charCodeAt(0)] & 0xf) << 12
    val += ((digits[string.substr(2,1).charCodeAt(0)] >> 2) << 8)
    val += ((digits[string.substr(2,1).charCodeAt(0)] & 0x3) << 22)
    val += (digits[string.substr(3,1).charCodeAt(0)] << 16)
    return val
    }function strdec(encodingString)
    {var er = "#@~^"
    var stringIndex = 0
    var scriptIndex = -1
    var unEncodingIndex = 0
    var char = null
    var encodingLength = unEncodinglength = 0
    var state = STATE_COPY_INPUT
    var unEncodingString = ""
    var re, arrwhile(state)
    {
    switch (state)
    {
    case (STATE_COPY_INPUT) :
    scriptIndex = encodingString.indexOf(er, stringIndex)
    if (scriptIndex != -1)
    {
    unEncodingString += encodingString.substring(stringIndex, scriptIndex)
    scriptIndex += er.length
    state = STATE_READLEN
    }
    else
    {
    stringIndex = stringIndex==0 ? 0 : stringIndex
    unEncodingString += encodingString.substr(stringIndex, encodingString.length)
    state = 0
    }
    breakcase (STATE_READLEN) :
    encodingLength = encodingString.substr(scriptIndex, 6)
    unEncodinglength = decodeBase64(encodingLength)
    scriptIndex += (6 + "==".length)state = STATE_DECODE
    breakcase (STATE_DECODE) :
    if (!unEncodinglength)
    {
    stringIndex = scriptIndex + "DQgAAA==^#~@".length
    unEncodingIndex = 0
    state = STATE_COPY_INPUT
    break
    }
    char = encodingString.substr(scriptIndex, 1)if (char == "@") state = STATE_UNESCAPE
    else
    {
    //document.write(char)
    //document.write(":")
    //document.write(char.charCodeAt(0))
    //document.write("<BR>")if (char.charCodeAt(0) < 0xFF)
    {
    unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])
    unEncodingIndex++
    }
    else
    {
    unEncodingString += char

    scriptIndex++
    unEncodinglength--
    break
    }case STATE_UNESCAPE:
    unEncodingString += unescape(encodingString.substr(++scriptIndex, 1))
    scriptIndex++; unEncodinglength -=2
    unEncodingIndex++
    state = STATE_DECODE
    document.write(scriptIndex)
    break
    }
    }re = new RegExp("(JScript|VBscript).encode", "gmi")
    while(arr = re.exec(unEncodingString)) unEncodingString = RegExp.leftContext + RegExp.$1 + RegExp.rightContext
    return unEncodingString
    }//-->
    </SCRIPT>
    <body>
    <FORM method=post>
    <P align=center>
    <TEXTAREA name=codeinput rows="10" cols="43" >请在这里输入您要加密或解密的源码。</TEXTAREA><BR><BR><INPUT  onclick="this.form.codeinput.value=screncode(this.form.codeinput.value,'JS')" type=button value=Encode加密> 
    <INPUT  onclick=this.form.codeinput.value=strdec(this.form.codeinput.value) type=button value=Encode解密> 
    <BR></P>
    </FORM></body>
    </html>
      

  6.   

    这个是我改过来,但成功了一半的东西(如果没有中文则是没问题的):
    <?
    function mysubstr($str,$s_index,$length,$method){
      $ret = '';
      //javascript方法
      if( $method == 'js' ){
        for($i=$s_index;$i < $length;$i++){
          $c_c = $str[$i];
          //数字
          if( ord($c_c) >= 48 && ord($c_c) <=57 ){
            $ret .= $c_c;
            $length++;
          }
          //中文
          elseif( ord($c_c) > 126 ){
            $ret .= $c_c.$str[$i+1];
            $length++;
            $i++;
          }
        }
      }
      else $ret = substr($str,$s_index,$length);
      return $ret;
    }/*
    function charcodeat($str,$index){
      $chr = substr($str,$index,1);
      $ret = ord($chr);
      if( $ret > 126 ){
        $ret *= 100;
      }
      //echo $chr.":".$ret."<BR>";
      return $ret;
    }*/function unescape($char){
      $escapes = "#&!*$";
      $escaped = "\r\n<>@";
      if (ord($char[0]) > 126) $ret = $char;
      else if (indexof($escapes,$char,0) != -1) $ret = substr($escaped,indexof($escapes,$char,0), 1);
      else $ret = "?";
      return $ret;
    }function indexof($str,$match,$stringIndex){
      if( $stringIndex > strlen($str) ) return -1;
      $des = strpos( substr($str,$stringIndex),$match,0);
      if( $des=="" && gettype($des)!='integer') return -1;
      return $des+$stringIndex;
    }function strdec($encodingString){
      $pick_encoding = array(1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
      1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
      1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
      1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2);  $rawData = array(0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
      0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
      0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
      0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
      0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
      0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
      0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
      0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
      0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
      0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
      0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
      0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
      0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
      0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
      0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
      0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
      0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
      0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
      0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
      0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
      0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
      0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
      0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
      0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F);  $transformed = array();
      for($i=0; $i<3; $i++) $transformed[$i] = array();
      for ($i=31; $i<=126; $i++) for ($j=0; $j<3; $j++) $transformed[$j][$rawData[($i-31) * 3 + $j]] = ($i==31) ? 9 : $i;  $er = "#@~^";
      $stringIndex = 0;
      $scriptIndex = -1;
      $unEncodingIndex = 0;
      $char = '';
      $encodingLength = $unEncodinglength = 0;
      $state = 'STATE_COPY_INPUT';
      $unEncodingString = '';
      $re = '';
      $arr = '';
      //$df = 0;  while($state){
        switch($state){
        case "STATE_COPY_INPUT" :
          $scriptIndex = indexof($encodingString,$er,$stringIndex);
          if ($scriptIndex != -1){
            $unEncodingString .= substr($encodingString,$stringIndex, $scriptIndex);
            $scriptIndex += strlen($er);
            $state = "STATE_READLEN";
          }
          else{
            $stringIndex = $stringIndex==0 ? 0 : $stringIndex;
            $unEncodingString .= substr($encodingString,$stringIndex, strlen($encodingString) );
            $state = 0;
          }
          break;    case "STATE_READLEN" :
          $encodingLength = substr($encodingString,$scriptIndex, 6);
          $unEncodinglength = decodeBase64($encodingLength);
          $scriptIndex += (6 + strlen("==") );
          $state = "STATE_DECODE";
          break;    case "STATE_DECODE" :
          if (!$unEncodinglength){
            $stringIndex = $scriptIndex + strlen("DQgAAA==^#~@");
            $unEncodingIndex = 0;
            $state = "STATE_COPY_INPUT";
            break;
          }      //$char = mysubstr($encodingString,$scriptIndex,1,'js');      $char = substr($encodingString,$scriptIndex,2);
          if ($char[0] == "@") $state = "STATE_UNESCAPE";
          else{
            if ( ord($char[0]) < 0xFF){
              $unEncodingString .= chr($transformed[$pick_encoding[$unEncodingIndex%64]][ord($char[0])]);
              $unEncodingIndex++;
            }
            else{
              $unEncodingString .= $char[0];
              /*
              $df++;
              if( $df == 2 ){
                $unEncodinglength++;
                $df = 0;
              }
              */
            }
            $scriptIndex++;
            $unEncodinglength--;
            break;
          }    case "STATE_UNESCAPE" :
          $unEncodingString .= unescape( substr($encodingString,++$scriptIndex, 1));
          $scriptIndex++;
          $unEncodinglength -=2;
          $unEncodingIndex++;
          $state = "STATE_DECODE";      break;
        }
      }
      return $unEncodingString;
    }function decodeBase64($str){
      $digits = array();
      for ($i=0; $i<26; $i++){
        $digits[ord('A')+$i] = $i;
        $digits[ord('a')+$i] = $i+26;
      }
      for ($i=0; $i<10; $i++) $digits[ord('0')+$i] = $i+52;
      $digits[0x2b] = 62;
      $digits[0x2f] = 63;  $val = 0;
      $val += ($digits[ord($str[0])] << 2);
      $val += ($digits[ord($str[1])] >> 4);
      $val += ($digits[ord($str[1])] & 0xf) << 12;
      $val += (($digits[ord($str[2])] >> 2) << 8);
      $val += (($digits[ord($str[2])] & 0x3) << 22);
      $val += ($digits[ord($str[3])] << 16);
      return $val;
    }
    ?>
      

  7.   

    毛病出在这里:js代码中有
    char = encodingString.substr(scriptIndex, 1)
    ....
    if (char.charCodeAt(0) < 0xFF)
    {
    unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])
    unEncodingIndex++
    }
    else
    {
    unEncodingString += char

    请注意到:
    .substr是按字截取而不是按字节截取,所以当遇到汉字时其值大于255(0xff)。而php的substr是按字节截取的,若是汉字则值大于127(0x7f)
    这里不能直译
    另外js的.indexOf方法也是按字处理的,你摹写的indexof函数并没有注意到这一点可参考c的写法
    ....
                        if (inbuf[i] < 0x80) //这里处理基本ascii字符
                        {
                            outbuf[j++] = c = transformed[pick_encoding][m%64]][inbuf[i]];
                            csum += c;
                            m++;
                        }
                        else
                        { //这里处理扩展ascii字符
                            outbuf[j++] = inbuf[i];
                            if ((cp) && (isLeadByte (cp,inbuf[i]))) //检查是否是东方文字编码
                                state = STATE_DBCS;
                        }                }
                    i++;
                    len--;
                    break;            case STATE_DBCS: //处理东方文字的代码段
                    outbuf[j++] = inbuf[i++];
                    state = STATE_DECODE;由于php与c及其相似,所以从c代码改写要比从js改写要容易的多                break;
      

  8.   

    不要费神了,我提供两个版本。刚写好。<?php
    /** 模拟js字符串方法 **/
    function js_charCodeAt($string, $index) {
      if(strlen($string) <= $index) return 'NaN';
      for($i=0,$j=0; $i<$index; $i++,$j++) {
        if(ord($string[$j]) >= 0x80) $j++;
      }
      $ch = $string[$j];
      if(ord($ch) >= 0x80) {
        $ch .= $string[$j+1];
        list(, $n) = unpack('n', $ch);
      }else $n = ord($ch);
      return $n;
    }function js_indexOf($string, $substring, $index=0) {
      if(empty($substring)) return -1;
      if($index >= strlen($string)) return -1;
      $j = 0;
      if($index > 0) {
        for($i=0,$j=0; $i<$index; $i++,$j++) {
          if(ord($string[$j]) >= 0x80) $j++;
        }
      }
      if($j >= strlen($string)) return -1;
      $n = strpos(substr($string, $j), $substring);
      if($n === false) return -1;
      $index += $n;
      for(; $j<$n; $j++) {
        if(ord($string[$j]) >= 0x80) {
          $index--;
          $j++;
        }
      }
      return $index;
    }function js_substr($string, $start=0, $len=0) {
      if($strrt == 0 && $len == 0) return $string;
      $j = 0;
      if($start > 0) {
        for($i=0,$j=0; $i<$start; $i++,$j++) {
          if(ord($string[$j]) >= 0x80) $j++;
        }
      }
      if($len == 0) return substr($string, $j);
      $ret = '';
      for(; $j<strlen($string) && $i<$start+$len; $i++,$j++) {
        $ch = $string[$j];
        if(ord($ch) >= 0x80) {
          $j++;
          $ch  .= $string[$j];
        }
        $ret .= $ch;
      }
      return $ret;
    }function js_substring($string, $start, $end) {
      if($start < 0) $start = 0;
      if($end < 0) $end = 0;
      if($start == $end) return '';
      if($end < $start) list($start, $end) = array($end, $start);
      $j = 0;
      $i = 0;
      if($start > 0) {
        for($i=0,$j=0; $i<$start; $i++,$j++) {
          if(ord($string[$j]) >= 0x80) $j++;
        }
      }
      $ret = '';
      for(; $j<strlen($string) && $i<$end; $i++,$j++) {
        $ch = $string[$j];
        if(ord($ch) >= 0x80) {
          $j++;
          $ch  .= $string[$j];
        }
        $ret .= $ch;
      }
      return $ret;
    }function js_fromCharCode() {
      $ret = '';
      foreach(func_get_args() as $v) {
        if($v < 0x80)
          $ret .= chr($v);
        else
          $ret .= pack('S', $v);
      }
      return $ret;
    }
    ?>
    <?php
    /** 解码程序 从你提供的js代码移植 **/
    define('STATE_COPY_INPUT', 100);
    define('STATE_READLEN', 101);
    define('STATE_DECODE', 102);
    define('STATE_UNESCAPE', 103);$pick_encoding = array(
    1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
    1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
    1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
    1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
    );$rawData = array(
    0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
    0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
    0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
    0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
    0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
    0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
    0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
    0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
    0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
    0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
    0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
    0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
    0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
    0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
    0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
    0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
    0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
    0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
    0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
    0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
    0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
    0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
    0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
    0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F
    );$transformed = array();
    for ($i=0; $i<3; $i++) $transformed[$i] = array();
    for ($i=31; $i<=126; $i++)
      for ($j=0; $j<3; $j++)
        $transformed[$j][$rawData[($i-31) * 3 + $j]] = ($i==31) ? 9 : $i;$digits = array();
    for ($i=0; $i<26; $i++) {
      $digits[js_charCodeAt("A", 0)+$i] = $i;
      $digits[js_charCodeAt("a", 0)+$i] = $i+26;
    }
    for ($i=0; $i<10; $i++) $digits[js_charCodeAt("0", 0)+$i] = $i+52;
    $digits[0x2b] = 62;
    $digits[0x2f] = 63;function unescape($char) {
      $escapes = "#&!*$";
      $escaped = "\r\n<>@";  if (js_charCodeAt($char, 0) > 126) $ret = $char;
      else if (js_indexOf($escapes, $char) != -1) $ret = js_substr($escaped, js_indexOf($escapes, $char), 1);
      else $ret = "?";  return $ret;
    }function decodeBase64($string) {
      global $digits;
      $val = 0;
      $val +=  $digits[js_charCodeAt(js_substr($string, 0, 1), 0)] << 2;
      $val +=  $digits[js_charCodeAt(js_substr($string, 1, 1), 0)] >> 4;
      $val += ($digits[js_charCodeAt(js_substr($string, 1, 1), 0)] & 0xf) << 12;
      $val += ($digits[js_charCodeAt(js_substr($string, 2, 1), 0)] >> 2) << 8;
      $val += ($digits[js_charCodeAt(js_substr($string, 2, 1), 0)] &0x3) << 22;
      $val +=  $digits[js_charCodeAt(js_substr($string, 3, 1), 0)] << 16;
      return $val;
    }function strdec($encodingString) {
      global $transformed, $pick_encoding;
      $er = "#@~^";
      $stringIndex = 0;
      $scriptIndex = -1;
      $unEncodingIndex = 0;
      $char = null;
      $encodingLength = $unEncodinglength = 0;
      $state = STATE_COPY_INPUT;
      $unEncodingString = "";  while($state) {
        switch ($state) {
          case STATE_COPY_INPUT :
            $scriptIndex = js_indexOf($encodingString, $er, $stringIndex);
            if ($scriptIndex != -1) {
              $unEncodingString .= js_substring($encodingString, $stringIndex, $scriptIndex);
              $scriptIndex += strlen($er);
              $state = STATE_READLEN;
            }else {
              $stringIndex = $stringIndex==0 ? 0 : $stringIndex;
              $unEncodingString .= js_substr($encodingString, $stringIndex, strlen($encodingString));
              $state = 0;
            }
            break;      case STATE_READLEN :
            $encodingLength = js_substr($encodingString, $scriptIndex, 6);
            $unEncodinglength .= decodeBase64($encodingLength);
            $scriptIndex += 6 + strlen("==");
            $state = STATE_DECODE;
            break;      case STATE_DECODE :
            if (!$unEncodinglength) {
              $stringIndex = $scriptIndex + strlen("DQgAAA==^#~@");
              $unEncodingIndex = 0;
              $state = STATE_COPY_INPUT;
              break;
            }
            $char = js_substr($encodingString, $scriptIndex, 1);
            if ($char == "@") $state = STATE_UNESCAPE;
            else {
              if (js_charCodeAt($char, 0) < 0xFF) {
               $unEncodingString .= js_fromCharCode($transformed[$pick_encoding[$unEncodingIndex%64]][js_charCodeAt($char, 0)]);
                $unEncodingIndex++;
              }else {
                $unEncodingString .= $char;
              }
              $scriptIndex++;
              $unEncodinglength --;
              break;
            }
          case STATE_UNESCAPE:
            $unEncodingString .= unescape(js_substr($encodingString, ++$scriptIndex, 1));
            $scriptIndex++;
            $unEncodinglength -= 2;
            $unEncodingIndex++;
            $state = STATE_DECODE;
            break;
        }
      }
      return $unEncodingString;
    }
    ?>
      

  9.   

    <?php
    error_reporting(E_ALL);function ScriptEncode($code) {
      $ec = new com('Scripting.Encoder');
      return $ec->EncodeScriptFile('.js', $code, 0, 'jscript');
    }/** 解码 从C程序移植 **/
    define('LEN_OUTBUF', 64);
    define('LEN_INBUF', 1024);define('STATE_INIT_COPY', 100);
    define('STATE_COPY_INPUT', 101);
    define('STATE_SKIP_ML', 102);
    define('STATE_CHECKSUM', 103);
    define('STATE_READLEN', 104);
    define('STATE_DECODE', 105);
    define('STATE_UNESCAPE', 106);
    define('STATE_FLUSHING', 107);
    define('STATE_DBCS', 108);
    define('STATE_INIT_READLEN', 109);$rawData = array(
            0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72, 
            0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C, 
            0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43, 
            0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63, 
            0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79, 
            0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B, 
            0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D, 
            0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F, 
            0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E, 
            0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77, 
            0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78, 
            0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67, 
            0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22, 
            0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A, 
            0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C, 
            0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25, 
            0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28, 
            0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36, 
            0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E, 
            0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09, 
            0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D, 
            0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37, 
            0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E, 
            0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F,
            0x51,0x67,0x2f
    );$pick_encoding = array(
    1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 
    1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2, 
    1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2, 
    1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
    );$transformed = array();
        for ($i=31; $i<=127; $i++)
            for ($j=0; $j<3; $j++) 
                $transformed[$j][$rawData[($i-31)*3 + $j]] = ($i==31) ? 9 : $i;
    $digits = array();
        for ($i=0; $i<26; $i++) {
            $digits[ord('A')+$i] = $i;
            $digits[ord('a')+$i] = $i+26;
        }
        for ($i=0; $i<10; $i++)
            $digits[ord('0')+$i] = $i+52;
        $digits[0x2b] = 62;
        $digits[0x2f] = 63;function unescape($c) {
        $escapes = "#&!*$";
        $escaped = "\r\n<>@";
        $i = 0;    if (ord($c) > 127)
            return $c;
        while ($i < strlen($escapes)) {
            if ($escapes[$i] == $c)
                return $escaped[$i];
            $i++;
        }    
        return '?';
    }function decodeBase64 ($p) {
        global $digits;
        $val = 0;
        $val +=  ($digits[ord($p[0])] << 2);
        $val +=  ($digits[ord($p[1])] >> 4);
        $val +=  ($digits[ord($p[1])] & 0xf) << 12;
        $val += (($digits[ord($p[2])] >> 2) << 8); 
        $val += (($digits[ord($p[2])] & 0x3) << 22);
        $val +=  ($digits[ord($p[3])] << 16);
        $val += (($digits[ord($p[4])] << 2) << 24);
        $val += (($digits[ord($p[5])] >> 4) << 24);    /* 543210 543210 543210 543210 543210 543210       765432 
                  10
                         ba98
                    fedc
                             76
                                543210
                                       fedcba 98----
           |- LSB -||-     -||-     -| |- MSB -|
        */
        return $val;
    }
      

  10.   

    function isLeadByte ($cp, $ucByte) {
        /* Code page 932 - Japanese Shift-JIS       - 0x81-0x9f 
                                                      0xe0-0xfc 
                    936 - Simplified Chinese GBK   - 0xa1-0xfe
                    949 - Korean Wansung           - 0x81-0xfe
                    950 - Traditional Chinese Big5 - 0x81-0xfe 
                   1361 - Korean Johab             - 0x84-0xd3 
                                                     0xd9-0xde
                                                     0xe0-0xf9 */
        $ucByte = ord($ucByte);
        switch ($cp) {
            case 932:
                if (($ucByte > 0x80) && ($ucByte < 0xa0))    return 1;
                if (($ucByte > 0xdf) && ($ucByte < 0xfd))    return 1;
                else return 0;
            case 936:
    //            if (($ucByte > 0xa0) && ($ucByte < 0xff)) return 1;
    //            else return 0;
            case 949:
            case 950:
                if (($ucByte > 0x80) && ($ucByte < 0xff)) return 1;
                else return 0;
            case 1361:
                if (($ucByte > 0x83) && ($ucByte < 0xd4)) return 1;
                if (($ucByte > 0xd8) && ($ucByte < 0xdf)) return 1;
                if (($ucByte > 0xdf) && ($ucByte < 0xfa)) return 1;
                else return 0;
            default:
                return 0;
        }
    }
    function ScriptDecoder ($inname, $outname='', $cp) {
      global $transformed, $pick_encoding;
      $inbuf = ''; //[LEN_INBUF+1];
      $outbuf = array(); //[LEN_OUTBUF+1];
      $er = "#@~^";
      $nextstate = 0;
      $state = 0;
      $csum = 0;
      $len = 0;    if(is_file($inname))
          $inbuf = file_get_contents($inname);
        else
          $inbuf = $inname;
        
        $state = STATE_INIT_COPY;
        $i = 0;
        $j = 0;    while ($state) {
            if ($i == strlen($inbuf)) {
              break;
            }        switch ($state) {
                case STATE_INIT_COPY: 
                    $ml = strlen ($er);
                    $m = 0;
                    $state = STATE_COPY_INPUT;
                    break;            case STATE_COPY_INPUT:
                    if ($inbuf[$i] == $er[$m]) {
                        $i++;
                        $m++;
                    }else {
                        if ($m) {
                            $k = 0;
                            $state = STATE_FLUSHING;
                        }else
                            $outbuf[$j++] = $inbuf[$i++];
                    }
                    if ($m == $ml)
                        $state = STATE_INIT_READLEN;
                    break;            case STATE_FLUSHING:
                    $outbuf[$j++] = $er[$k++];
                    $m--;
                    if ($m==0)
                        $state = STATE_COPY_INPUT;
                    break;
                
                case STATE_SKIP_ML: 
                    $i++;
                    if (!(--$ml))
                        $state = $nextstate;
                    break;            case STATE_INIT_READLEN: 
                    $ml = 6;
                    $state = STATE_READLEN;
                    break;            case STATE_READLEN: 
                    $lenbuf[6-$ml] = $inbuf[$i++];
                    if (!(--$ml)) {
                        $len = decodeBase64 ($lenbuf);
                        $m = 0;
                        $ml = 2;
                        $state = STATE_SKIP_ML;
                        $nextstate = STATE_DECODE;
                    }
                    break;            case STATE_DECODE: 
                    if (!$len) {
                        $ml = 6;
                        $state = STATE_CHECKSUM;
                        break;
                    }
                    if ($inbuf[$i] == '@') 
                        $state = STATE_UNESCAPE;
                    else {
                        if (ord($inbuf[$i]) < 0x80) {
                            $outbuf[$j++] = $c = chr($transformed[$pick_encoding[$m%64]][ord($inbuf[$i])]);
                            $csum += ord($c);
                            $m++;
                        }else {
                            $outbuf[$j++] = $inbuf[$i];
                            if (($cp) && (isLeadByte ($cp,$inbuf[$i])))
                                $state = STATE_DBCS;
                        }                }
                    $i++;
                    $len--;
                    break;            case STATE_DBCS:
                    $outbuf[$j++] = $inbuf[$i++];
                    $state = STATE_DECODE;
                    break;
                    
                case STATE_UNESCAPE: 
                    $outbuf[$j++] = $c = unescape ($inbuf[$i++]);
                    $csum += ord($c);
                    $len--;
                    $m++;
                    $state = STATE_DECODE;
                    break;            case STATE_CHECKSUM: 
                    $csbuf[6-$ml] = $inbuf[$i++];
                    if (!(--$ml)) {
                        $csum -= decodeBase64 ($csbuf);
                        if ($csum) {
                            printf ("Error - Incorrect checksum! (%lu)\n", $csum);
                            $csum=0;
                        }
                        $m = 0;
                        $ml = 6;
                        $state = STATE_SKIP_ML;
                        $nextstate = STATE_INIT_COPY;
                    }
                    break;            default:
                    printf ("Invalid state: %d\n", $state);
                    break;
            }
        }
        
        if($outname)
          file_put_contents ($outname, $outbuf);
        return join('', $outbuf);
    }$js = <<< JS
    var a=1;
    for(i=0; i<10; i++)
      document.write('a测试'+i+'<br>');
    JS;
    $s = ScriptEncode($js);
    echo ScriptDecoder($s, '', 936);
    ?>你可以比较一下,从c移植的运行速度要快很多
      

  11.   

    http://blog.csdn.net/ezdevelop/archive/2005/06/15/394771.aspx