java中等效encodeuri_encodeURI来解决URL传递时的中文问题
在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码.
使用JQUERY中所提供的方法来做操作
encodeURI
function verify() {
//解决中文乱麻问题的方法1,页面端发出的数据作一次encodeURI,
服务器段使用进行转移成UTF-8;
//解决中文乱麻问题的方法2,页面端发出的数据作两次encodeURI,
这个做的好处在于,不管浏览器用户在页面来设置编码,服务器所采用的编码来做一次URLencode转换成UTF-8.
var url = "AJAXServer?name=" + encodeURI(encodeURI($("#userName").val()));
url = convertURL(url);
$.get(url,null,function(data){
$("#result").html(data);
});
}
说明:1 .encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码.
2. UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.
这里要做两次encodeURI的原因以及说明::
具体说明其中具体的原理分析如下,假设页面端输入的中文是一个“中”,按照下面步骤进行解码
1.第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]
2.第二次encodeURI,把数组最后变成[%25E4,%25B8,%25AD]然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端,
当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,URldecode操作和encodeURL操作是相反的操作,处理结果就是[%E4,%B8,%AD],并把这个值返回给getParameter方法
然后再在服务器端中调用相应的URL转码方法或者是函数 就可以把数据还原成最初页面发送过来的中文“中”了。---------------------------------------------------------------------------------
JS、C#编码解码
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
1.
JS: escape :js使用数据时可以使用escape
例如:搜藏中history纪录。
0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
解码使用:unescape
C#:
HttpUtility.UrlEncode
HttpUtility.UrlDecode
2.
JS: encodeURI :进行url跳转时可以整体使用encodeURI
例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");
解码使用decodeURI();
C#: decodeURIComponent
3.
JS: encodeURIComponent :传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。
例如:
解码使用decodeURIComponent()
C#:
[HttpContext.Current.]Server.UrlDecode
[HttpContext.Current.]Server.UrlEncode
------------------------------------------------------------------------------------------------------------------
URL编码与两次encodeURI
当使用地址栏提交查询参数时,如果不编码,非英文字符会按照操作系统的字符集进行编码提交到服务器,服务器会按照配置的字符集进行解码,所以如果两者不一致就会导致乱码。
encodeURI函数采用UTF-8对URL进行编码,所以如果服务器在进行解码时使用的是其他的编码方式就会出现乱码,默认的服务器配置的解码字符集都不是UTF-8,所以大部分情况下地址栏提交中文查询参数时会产生乱码;针对这种情况,可以连续使用两次encodeURI在客户端(主要指浏览器)对非英文字符进行编码,然后在服务端使用java.net.URLDecoder(String."UTF-8")解码,即可得到正确的中文。
如果只进行一次encodeURI,得到的是UTF-8形式的URL,服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)就会得到乱码。
如果进行两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO-8859-1编码的效果相同。在服务器端,首先通过request.getParameter()自动进行第一次解码(可能是gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)得到ascii字符,然后再使用UTF-8进行第二次解码,通常使用java.net.URLDecoder("","UTF-8")方法。
两次编码两次解码的过程为:
UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和解码的过程是对称的,所以不会出现乱码。
encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码.
. UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.
假设页面端输入的中文是一个“中”,按照下面步骤进行解码
1.第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[�,�,�] 此时已经没有了多字节字符,全部是单字节字符。
2、第二次encodeURI,进行编码,会把%看成一个转义字符,并不编码%以后字符,会把%编码成%.把数组最后变成[�,�,�]然后就把处理后的数据[�,�,�]发往服务器端,
当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
应用服务器最初获得的就是发送来的[�,�,�],应用服务器会对这个数据进行URLdecode操作,应用服务器进行解码的这一次,不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[�,�,�],因为都会把%解析成%.并把这个值返回给getParameter方法
3、再用UTF-8解码一次,就得到"中"了。
想想看,如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码。document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;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");
roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");
java中等效encodeuri_encodeURI来解决URL传递时的中文问题相关推荐
- 【javaScript】encodeURI来解决URL传递时为什么需要进行两次encodeURI编码
encodeURI来解决URL传递时为什么需要进行两次encodeURI编码 文章来源于https://blog.csdn.net/u012027337/article/details/5212647 ...
- Java中多线程访问冲突的解决方式
Java中多线程访问冲突的解决方式 当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题 ...
- java中的参数传递(只有值传递没有引用传递)
Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递).所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答. java中的数据类 ...
- 【Java问题】全网无法解决你的的IDEA中文乱码问题,不妨来看这篇文章
[Java问题]全网无法解决你的的IDEA中文乱码问题,不妨来看这篇文章 1. 如果你试了所有的方法解决不了,你就默认使用GBK即可 这个方式是我试了全网几乎所有的都不行的解决方案 File -> ...
- java url 传值乱码问题_解决URL传递中文时出现乱码问题(三种解决方法)
一.问题场景 一般在使用下面几种使用场景情况下,传递参数为中文时,接收得到的值都有可能乱码,具体如下: 1.直接在浏览器使用url地址访问 2.页面提交form表单时,method设置为GET 3.使 ...
- 利用java中for循环,递归解决机选双色球问题
利用java中简单的for循环,if判断和递归思想,解决机选双色球的问题 public static void main(String[] args) { /** * 双色球的选取共有两部分,红球和蓝 ...
- java中线程死锁的解决方法_Java线程死锁实例及解决方法
这篇文章主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.死锁的定义 所谓死锁是指多个线程因竞争资源而造成 ...
- Android+Java中使用RSA加密实现接口调用时的校验功能
场景 RSA加密 RSA算法是一种非对称加密算法,那么何为非对称加密算法呢? 一般我们理解上的加密是这样子进行的:原文经过了一把钥匙(密钥)加密后变成了密文,然后将密文传递给接收方,接收方再用这把钥匙 ...
- java中任何变量都可以被赋值为null,java中当给一个对象赋值为null时发生了什么...
比如下面的代码 String[] arr = new String[10]; arr=null; 将arr这个引用置空,不指向任何对象. 上面new的那个数组对象,则没有任何引用指向它,垃圾回收器可以 ...
最新文章
- 怎么打公式_迫真公式部~注入之里技
- C++源码的调用图生成
- PHP反射之类的反射
- linux字体如何删除不了,如何彻底替换Ubuntu下Chrome字体(清除楷体字)
- 客制化键盘键位修改_IQUNIX Slim87 RGB机械键盘评测
- 怎么查jupyter lab 内核_抗氧化精华推荐 CHA:LAB诗蕾泊帮你告别“零点肌”|抗氧化|精华-综合资讯...
- 使用 ftrace 调试 Linux 内核,第 1 部分【转】
- jquey知识点整理
- 阿里云ECS更换系统时提示主机名不支持windows镜像要求的解决方法
- aspen如何确定塔板数_Aspen Plus入门教程(3)-简捷法计算理论板数
- 运行vba代码的快捷键
- Android模拟点击
- 图像分割算法的优缺点比较
- linux sub指令,数据处理指令之:SUB减操作指令
- 验证码2020最新最实用的验证码
- strtol strtoll strtoul strtoull应用
- 解析大多数WordPress用户都选择托管虚拟主机的原因
- python哈姆雷特词频统计_人生苦短我用Python——哈姆雷特词频统计
- 家用简单电线路图_家庭电路安装走线图解析,教你4步快速布线
- 这简直是无敌好嘛!阿里巴巴开源落地可实操项目:网约车+咚宝商城+英雄传说三合一
热门文章
- Servlet服务器端程序
- 【Polelink北汇信息】EV初创公司如何降低软件开发成本和风险
- VMware虚拟化- VSphere vCenter 虚拟交换机理论及应用
- 顺利通过论文查重检测的小技巧
- 解决 github 报错 Failed to connect to github.com port 443:connection timed out
- 程序员用 Python 破解同事的加密压缩包!不小心知道了……
- 防火墙工作原理(工作方式)
- 计算机程序工作日志,计算机程序员实习日记大全
- Excalidraw - 免费的手绘风格白板应用,能够画各种流程图、示意图、架构图
- 《天讨胡虏檄》神权主义与排满内核的冲突·《中国近百年政治史》