﻿/*  
 * GB2312转UTF8  
 * 例：  
 * var xx=new GB2312UTF8();  
 * var Utf8=xx.Gb2312ToUtf8("你aaa好aaaaa");  
 * var Gb2312=xx.Utf8ToGb2312(Utf8);  
 * alert(Gb2312);  
 */  
  
function formatUTF(str) 
{
    str = decodeURI(str);
    var result = '';
    var i;
    for( i=0; i<str.length; i++ )
    {
        var c = str.charCodeAt(i);
        result += str2asc(str.charAt(i));
    }
    return result;
}

function Utf8ToGb2312( str )
{
    str = encodeURIComponent( str );
    str = formatUTF(str);
    var result = '';
    for( i=0; i< str.length; i += 2 )
    {
        result = result + '%' + str.substr(i,2);
    }
    return result;
}
        
function GB2312UTF8( )
{
	this.Dig2Dec = function( s )
	{
		var retV = 0;
		if(s.length == 4)
		{
			for(var i = 0; i < 4; i ++)
			{
				retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
			}
			return retV;
		}
		return -1;   
	}
	this.Hex2Utf8 = function( s )
	{
		var retS = "";
		var tempS = "";
		var ss = "";
		if( s.length == 16 )
		{
			tempS = "1110" + s.substring( 0, 4 );
			tempS += "10" +  s.substring( 4, 10 );
			tempS += "10" + s.substring( 10, 16 );
			var sss = "0123456789ABCDEF";
			for(var i = 0; i < 3; i ++)
			{
				retS += "%";
				ss = tempS.substring(i * 8, (eval(i)+1)*8);
				retS += sss.charAt(this.Dig2Dec(ss.substring(0,4)));
				retS += sss.charAt(this.Dig2Dec(ss.substring(4,8)));
			}
			return retS;
		}
		return "";
	}
	this.Dec2Dig = function( n1 )
	{
		var s = "";
		var n2 = 0;
		for(var i = 0; i < 4; i++)
		{
			n2 = Math.pow(2,3 - i);
			if( n1 >= n2 )
			{
				s += '1';
				n1 = n1 - n2;
			}   
			else
			{
				s += '0';
			}
		}	
		return s;
	}
	this.Str2Hex = function( s )
	{
      var c = "";
      var n;   
      var ss = "0123456789ABCDEF";   
      var digS = "";   
      for(var i = 0; i < s.length; i ++)
      {   
         c = s.charAt(i);   
         n = ss.indexOf(c);   
         digS += this.Dec2Dig(eval(n));   
      }   
      return digS;   
    }   
  this.Gb2312ToUtf8=function(s1){   
    var s = escape(s1);   
    var sa = s.split("%");   
    var retV ="";   
    if(sa[0] != ""){   
      retV = sa[0];   
    }   
    for(var i = 1; i < sa.length; i ++){   
      if(sa[i].substring(0,1) == "u"){   
        retV += this.Hex2Utf8(this.Str2Hex(sa[i].substring(1,5)));   
        if(sa[i].length){   
          retV += sa[i].substring(5);   
        }   
      }   
      else{   
        retV += unescape("%" + sa[i]);   
      /*  if(sa[i].length){   
          retV += sa[i].substring(5);   
        }
       */   
      }   
    }   
    return retV;   
  }   
  this.Utf8ToGb2312=function(str1){   
        var substr = "";   
        var a = "";   
        var b = "";   
        var c = "";   
        var i = -1;   
        i = str1.indexOf("%");   
        if(i==-1){   
          return str1;   
        }   
        while(i!= -1){   
          if(i<3){   
                substr = substr + str1.substr(0,i-1);   
                str1 = str1.substr(i+1,str1.length-i);   
                a = str1.substr(0,2);   
                str1 = str1.substr(2,str1.length - 2);   
                if(parseInt("0x" + a) & 0x80 == 0){   
                  substr = substr + String.fromCharCode(parseInt("0x" + a));   
                }   
                else if(parseInt("0x" + a) & 0xE0 == 0xC0){ //two byte   
                        b = str1.substr(1,2);   
                        str1 = str1.substr(3,str1.length - 3);   
                        var widechar = (parseInt("0x" + a) & 0x1F) << 6;   
                        widechar = widechar | (parseInt("0x" + b) & 0x3F);   
                        substr = substr + String.fromCharCode(widechar);   
                }   
                else{   
                        b = str1.substr(1,2);   
                        str1 = str1.substr(3,str1.length - 3);   
                        c = str1.substr(1,2);   
                        str1 = str1.substr(3,str1.length - 3);   
                        var widechar = (parseInt("0x" + a) & 0x0F) << 12;   
                        widechar = widechar | ((parseInt("0x" + b) & 0x3F) << 6);   
                        widechar = widechar | (parseInt("0x" + c) & 0x3F);   
                        substr = substr + String.fromCharCode(widechar);   
                }   
              }   
              else {   
               substr = substr + str1.substring(0,i);   
               str1= str1.substring(i);   
              }   
              i = str1.indexOf("%");   
        }   
  
        return substr+str1;   
  } 
}

function UrlDecode(str)
{ 
	var ret=""; 
	for( var i=0; i<str.length; i++ )
	{
		var chr = str.charAt(i); 
		if(chr == "+")
		{ 
			ret+=" ";
		}
		else if( chr=="%" )
		{
			var asc = str.substring(i+1,i+3);
			if( parseInt( "0x" + asc) > 0x7f )
			{
				ret += asc2str( parseInt( "0x" + asc + str.substring( i+4, i+6 ) ) );
				i += 5;
			}
			else
			{
				ret += asc2str( parseInt( "0x" + asc ) );
				i += 2;
			}
		}
		else
		{
			ret += chr;
		}
	} 
	return ret;
}
