GB 2312エンコーディングencodeURI()後どのようにdecode


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
</head>
<body>

<script type="text/javascript" src="http://www.btbtd.org/test/sqJsTools/tools/Url/Url/CP936.js
"></script>
<script type="text/javascript">
/*<![CDATA[*/
/*
 : 
CSND  :http://hi.csdn.net/btbtd
 :http://www.btbtd.org/
 */
 var pe = "%D6%D0%B9%FA";
 document.write("<p/>pe: "+pe);
 document.write("<p/>de: "+IDecodeURIGb(pe, [CP936]));
 document.write("<hr/>");


 function IDecodeURIGb(Source, CP936) // Pe = percent encoding; %xx[,%xx]
 { // shawl.qiu code, return string|void return; Func: fGetUtfHex
  var bStr = false;
  if(Source.constructor==String) Source = [Source], bStr = true;

  //if(CP936==null) fFatalError(" !");

  var iLBound = iUBound = 0;
  iLBound = -1; iUBound = 0x7f;

  Source[0] = Source[0].replace(/\+/g, " ");

  var Len = Source[0].length;

  for(var i=0; i<Len; i++)
  {
   var iIndex = Source[0].indexOf("%", i);
   if(iIndex===-1) break;

   var sHex = Source[0].slice(iIndex+1, iIndex+3);
   var iCode = parseInt(sHex, 16);

   //document.write("<br/>sHex: "+sHex);

   if(iCode>-1&&iCode<=0x7f) // ascii
   {
    Source[0] =
    [
     Source[0].slice(0, iIndex)
     , String.fromCharCode(iCode)
     , Source[0].slice(iIndex+3)
    ].join("");
   }
   else
   {
    var sHexRaw = Source[0].slice(iIndex+3, iIndex+6);
    //document.write("<br/>sHexRaw: "+sHexRaw);
    if(sHexRaw.charAt(0)!="%") continue;
    sHex += sHexRaw.slice(1);
    var sUniHex = fGetUtfHex(sHex, CP936);
    //document.write("<br/>sHex: "+sHex);
    //document.write("<br/>sUniHex: "+sUniHex);
    Source[0] =
    [
     Source[0].slice(0, iIndex)
     , String.fromCharCode(parseInt(sUniHex, 16))
     , Source[0].slice(iIndex+6)
    ].join("");
   } // end if(iCode<-1&&iCode<0x7f)
  } // end for(var i=0; i<Len; i++)

  if(bStr) return Source[0];
 } // end function IDecodeURIGb(Source)

 function fGetUtfHex(sGbHex, CP936)
 { // shawl.qiu code, return string
  sGbHex = sGbHex.toUpperCase();
  var iIndex = CP936[0].indexOf(sGbHex);
  if(iIndex===-1) return "0x005F";

  var iBegin = iIndex+sGbHex.length+1;
  return CP936[0].substring(iBegin, iBegin+6);
 } // end function fGetMapTableChar(sHex)
/*]]*/
</script>
</body>
</html>