zoukankan      html  css  js  c++  java
  • 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方法就是乱码了。

    核心代码

    js :​   encodeURI(encodeURI("rowObj.appName"))

    java :java.net.URLDecoder.decode(request.getParameter("roleName"),"UTF-8");  ​

     

    个人小结,仅做参考,如有问题,欢迎各位大神指教,另外,感谢两篇参考文献,地址:

    ​http://blog.csdn.net/howlaa/article/details/12834595

    http://www.tuicool.com/articles/fuqIBju

  • 相关阅读:
    小程序本地数据的存储
    cocos2d-x中CCTableView介绍
    C++中map容器的说明和使用技巧
    不修改代码,关闭vs2010 C4819警告
    Cocos2d-x 处理双击事件的两种方法
    Cocos2d-x 实现模态对话框
    Cocos2d-x init() 和 onEnter() 区别
    Cocos2d-x 中 CCProgressTimer
    Cocos2d-x 实现技能冷却效果
    输出第 n 个斐波纳契数(Fibonacci)
  • 原文地址:https://www.cnblogs.com/max-tlp/p/6673530.html
Copyright © 2011-2022 走看看