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

  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/max-tlp/p/6673530.html
Copyright © 2011-2022 走看看