JS encodeURI转码

背景:URI链接对于带有中文字符的参数传入会有编码转换问题,不做处理则会出现乱码。

处理逻辑:对URI进行编码传送——后端经行URI解码还原

使用方法:

   前端:

    var url = http://ip:port/context?PARAM=中文;

     //转码(要转码两次)          

      url1 =encodeURI(url);//转码一次

      url2 =encodeURI(url2);//再转码一次


   后端:

    String param = request.getParameter("PARAM");

     if(!StringUtils.isEmpty(param)){

         param = URLDecoder.decode( request.getParameter("PARAM"),"UTF-8");//解码

     }


解说:

前端解码两次说明:

假设页面端输入的中文是一个“中”,按照下面步骤进行解码
1.第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]  此时已经没有了多字节字符,全部是单字节字符。
2、第二次encodeURI,进行编码,会把%看成一个转义字符,并不编码%以后字符,会把%编码成%25.把数组最后变成[%25E4,%25B8,%25AD]然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端,
当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,应用服务器进行解码的这一次,不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[%E4,%B8,%AD],因为都会把%25解析成%.并把这个值返回给getParameter方法
3\、再用UTF-8解码一次,就得到"中"了。
想想看,如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码。



知识扩展:

一、JS编码方式

 1. escape():

采用unicode字符集对指定的字符串除0-255以外进行编码。所有的空格符、标点符号、特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z。


2.encodeURI():

把URI字符串采用UTF-8编码格式转化成escape各式的字符串。
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z


3.encodeURIComponent() 

把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,encodeURI()将对更多的字符编码,比如 / 等字符。所以假如字符串里面包含了URI的几个部份的话,不要用进行编码,否则 / 字符被编码之后URL将呈现错误。
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z


分析:

   不希望把字符串编码转换为UTF-8的格式或者你的页面编码和目标页面的编码是一致的时候可以采用escape

   如果你的页面是其他的编码方式,但是再接受参数parameter的时候是UTF-8编码,则选择用encodeURI()和encodeURIComponet()

通常使用:encodeURI()


你可能感兴趣的:(开发技术)