• 简单明了区分escape、encodeURI和encodeURIComponent


    二、escape和它们不是同一类

    简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
    编码之后的效果是%XX或者%uXXXX这种形式。
    其中 ASCII字母、数字、@*/+ ,这几个字符不会被编码,其余的都会。
    最关键的是,当你需要对URL编码时,请忘记这个方法,这个方法是针对字符串使用的,不适用于URL。
    事实上,这个方法我还没有在实际工作中用到过,所以就不多讲了。

    三、最常用的encodeURI和encodeURIComponent

    对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的。
    它们都是编码URL,唯一区别就是编码的字符范围,其中
    encodeURI方法不会对下列字符编码  ASCII字母、数字、~!@#$&*()=:/,;?+'
    encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!*()'
    所以encodeURIComponent比encodeURI编码的范围更大。
    实际例子来说,encodeURIComponent会把 http://  编码成  http%3A%2F%2F 而encodeURI却不会。
     
     

    四、最重要的,我该什么场合用什么方法

    区别上面说的很清楚了,接下来从实际例子来说说把。
        
    1、如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
     
    2、如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI。
     
    比如
    encodeURI("http://www.cnblogs.com/season-huang/some other thing");
    编码后会变为
    "http://www.cnblogs.com/season-huang/some%20other%20thing";

    其中,空格被编码成了%20。但是如果你用了encodeURIComponent,那么结果变为

    "http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"

    看到了区别吗,连 "/" 都被编码了,整个URL已经没法用了。

      

    3、当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。

    var param = "http://www.cnblogs.com/season-huang/"; //param为参数
    param = encodeURIComponent(param);
    var url = "http://www.cnblogs.com?next=" + param;
    console.log(url) //"http://www.cnblogs.com?next=http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2F"
    看到了把,参数中的 "/" 可以编码,如果用encodeURI肯定要出问题,因为后面的/是需要编码的。
     
     

    javascript 常用的编码格式:escape(), encodeURL(), encodeURIComponent()
    来源:http://hi.baidu.com/bbjjss2008/blog/item/8c8c0a3d29677e06bba1676a.html
    escape() 方法:
    采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。不会被此方法编码的字符: @ * / +

    encodeURI() 方法:
    把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

    encodeURIComponent() 方法:
    把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) '因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。

    <title> url字符串的加密与解密 </title>

    <script language="JavaScript">
    var str="http://hi.baidu.com/bbjjss2008l?country=中国&name=jz";
    var urlStr=escape(str);
    document.write("escape方法加密:<br>"+urlStr+"<br>解密后url字符串是:<br>"+unescape(str));
    urlStr=encodeURI(str);
    document.write("<br>encodeURI:方法加密:<br>"+urlStr+"<br>解密后url字符串是:<br>"+decodeURI(str));
    urlStr=encodeURIComponent(str);
    document.write("<br>encodeURIComponent:方法加密:<br>"+urlStr+"<br>解密后url字符串是:<br>"+decodeURIComponent(str));
    </script>

    URL传中文参数导致乱码的解决方案之encodeURI

    通过URL传中文参数时,在服务端后台获取到的值往往会出现乱码问题,解决方案有很多种,本文主要介绍如何通过encodeURI来解决中文乱码问题:

    first:前端传递参数的时候需要对中文参数进行两次encodeURI处理:

    ​var requestUrl = 'url?roleName='+encodeURI(encodeURI("rowObj.appName")); 

    注:rowObj.appName​表示即将传到后台的带中文的字符串

    ​second:在服务器端后台程序代码中要用java.net.Decode进行解码,得到中文:

    String appName= java.net.URLDecoder.decode(request.getParameter("roleName"),"UTF-8");

    两步搞定!

    然而,为什么前端要进行两次encodeURI???原因如下:

    1、encodeURI函数主要是来对URI来做转码,它默认采用的是utf-8的编码;​

    2、常规来看,中文汉字在utf-8中一般是3个字节构成,每一个字节会转换成16进制的编码,同时加上%号;

    假设页面中需要传到后台的中文是一个“中”字,按照下面的过程走一遍:

    1)第一次encodeURI,按照utf-8的方式获取字节数变成[-28,-72,-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,于是就变成了[E4,B8,AD],最终变成[%  E4,%  B8,%  AD]   (注意:请去掉%和编码中间的空格,我这边写出来你们看到就是乱码了,下面的这种也是一样),此时已经没有了多字节字符,全部都是单字节字符。

    2)第二次encodeURI进行编码,会把%看做转义字符,并且不编码%后面的字符,会把%变为%​25,于是刚刚的数组就变成了[%  E4,%  B8,%  AD],然后就把处理好的[%  E4,%  B8,%  AD]发往服务器,当应用服务器调用getparameter方法时,getparameter方法会去向应用服务器请求参数,然而应用服务器最初收到的就是从前端发来的[%  E4,%  B8,%  AD],应用服务器容器会默认解一次码,而容器默认解码时采用的编码是容器的默认编码,可能是utf-8,GBK,或者ISO-8859,都能得到[%  E4,%  B8,%  AD],因为会把%解析成%,并且把这个值返回给getparameter方法;

    3)最终用​java.net.Decode 采用utf-8编码进行解码,就能得到“中”字了;

    所以,如果当时只是单单编码一次,当​容易自动解码(默认解一次码)的时候,如果是按照 ISO-8859 去解码 UTF-8 编码的东西然后返回给getparameter方法就是乱码了。

  • 相关阅读:
    Linux中杀不死的进程
    SQL语句 不支持日语 韩语 泰国语等的解决办法
    很长时间没写,重新开始每天进步一点点
    c#使用access数据库时 模糊查询 like 通配符的写法
    每天进步一点点之找工作的心路历程
    每天进步一点点之工作前三天
    Ajax实现原理
    java动态代理的原理
    css定位机制总结
    迷宫,较为高效的C++代码 BFS实现
  • 原文地址:https://www.cnblogs.com/itjeff/p/12894796.html
Copyright © 2020-2023  润新知