日期:2014-05-16  浏览次数:20395 次

js 三种编码格式及区别

js 三种编码格式及区别:

?

js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent

1、   传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。                            

例如:<script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent("http://cang.baidu.com/bruce42")+'">退出</a>');</script>

2、   进行url跳转时可以整体使用encodeURI

例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");

3、   js使用数据时可以使用escape
[Huoho.Com编辑] 
例如:搜藏中history纪录。
4、   escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
AJAX传递中文字符串时必须把中文字符串编码成unicode,一般会用到JS的自带函数escape().不过找到了更好的函数来确决中文字符转换成unicode编码的函数
function uniencode(text) 
{ 
    text = escape(text.toString()).replace(/\+/g, "%2B"); 
    var matches = text.match(/(%([0-9A-F]{2}))/gi); 
    if (matches) 
    { 
        for (var matchid = 0; matchid < matches.length; matchid++) 
        { 
            var code = matches[matchid].substring(1,3); 
            if (parseInt(code, 16) >= 128) 
            { 
                text = text.replace(matches[matchid], '%u00' + code); 
            } 
        } 
    } 
    text = text.replace('%25', '%u0025'); 
  
    return text; 
}
当然服务器端要对编码过的字符串进行第二次转码.把字符串转换成UTF-8编码.
function convert_int_to_utf8($intval) 
{ 
    $intval = intval($intval); 
    switch ($intval) 
    { 
        // 1 byte, 7 bits 
        case 0: 
            return chr(0); 
        case ($intval & 0x7F): 
            return chr($intval); 
        // 2 bytes, 11 bits 
        case ($intval & 0x7FF): 
            return chr(0xC0 | (($intval >> 6) & 0x1F)) . 
                chr(0x80 | ($intval & 0x3F)); 
  
        // 3 bytes, 16 bits 
        case ($intval & 0xFFFF): 
            return chr(0xE0 | (($intval >> 12) & 0x0F)) . 
                chr(0x80 | (($intval >> 6) & 0x3F)) . 
                chr (0x80 | ($intval & 0x3F)); 
  
        // 4 bytes, 21 bits 
        case ($intval & 0x1FFFFF): 
            return chr(0xF0 | ($intval >> 18)) . 
                chr(0x80 | (($intval >> 12) & 0x3F)) . 
                chr(0x80 | (($intval >> 6) & 0x3F)) . 
                chr(0x80 | ($intval & 0x3F)); 
    } 
} 
这样中文字符串就可以转换成UTF-8编码.这种方法适合各种服务器环境..

?