为什么要两次调用encodeURI来解决乱码问题

  encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码。

  UTF-8编码的格式:一个汉字由三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号。

  假设页面端输入的中文是一个“中”,按照下面步骤进行解:

  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:

document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType; 

JAVA后台:

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

或者:encodeURIComponent(),对url组件的编码

//JavaScript:
window.self.location="index.jsp?data="+encodeURIComponent(encodeURIComponent(url));

//java:
searchtext=java.net.URLDecoder.decode(data,"UTF-8");

 

  另外还有一种方法是JavaScript进行一次编码,后台java处理时换种写法就好了:

java代码:String s = new String(request.getParameter("data").getBytes("ISO8859-1"), "UTF-8");

"&name="+encodeURI($("#mergeSoft_name").val())
name = getRequest().getParameter("name");
name = URLDecoder.decode(name,"utf-8");
name=new String(name.getBytes("ISO-8859-1"),"utf-8");

 

posted @   古兰精  阅读(1949)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示