`
shiwk
  • 浏览: 27033 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

为什么要encodeURI(url)两次才不会出现乱码?

阅读更多

因为Tomcat服务器会自动帮你做一次URLDecode,所以再加上你自己在代码里面写的URLDecode,一共就是两个Decode了,既然要两次Decode,当然就需要两次Encode了。或许你会问,干脆只Encode一次,然后在java代码里不Decode,呵呵,这个也是不行的,这其实也就是为什么要进行Encode的原因吧

 

--------------------------------------------------------------------------------------------------------

 

一般情况下, 发送 encodeURIComponent(parmeName)+"="+encodeURIComponent(parmeValue);
接收时, 直接 String paramValue = request.getParameter(paramName); // 容器自动解码.

我们知道 encodeURIComponent 使用的是 UTF-8 编码规则来编的.
如果 request.getParameter(paramName) 时,容器也按 UTF-8 解的话,是正确的. 根本无须在客户端
进行二次的 encodeURIComponent(...)


如果 request.getParameter(paramName),容器没有按 UTF-8 解的话, 结果只有一个,就是乱码!
容器按什么编码来解码,决定于 request.setCharacterEncoding(***) 或者 服务器程序配置.

如果你在 jsp 程序中,能够 request.setCharacterEncoding("UTF-8"), 并且 修改服务器配置,让容器在解 GET 提交的参数时,使用 UTF-8.

客户端提交前不用二次编码, 接收时,也只要直接 request.getParameter(paramName) 即可

---------------------

为什么网上会有人提出在客户端对字符串重复编码两次呢.
如果因为项目需要,不能指定容器使用何种编码规则来解码提交的参数, 比如:需要接收来自不同页面,不地编码的参数内容时。 (又或者是开发人员被这有点复杂的东东搞得晕头转向,不懂得如何正确的去做好这接收参数的工作)
这个时候,在客户端对参数进行二次编码,可以有效的避开提交多字节字符”的这个棘手问题。
因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR_ENC1] 好了。[STR_ENC1] 是不带有多字节字符的)
再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR_ENC1])
然后,再在程序中实现一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的参数的原值。

分享到:
评论

相关推荐

    URL传中文参数导致乱码的解决方案之encodeURI

    URL传中文参数导致乱码的解决方案之encodeURI

    javaScript encodeURI中文乱码

    javaScript encodeURI中文乱码

    java URL中文参数乱码处理

    js 中乱码处理法方式 encodeURIComponent(encodeURIComponent(customerAddress)) ...encodeURI(url) String qijuType= new String(request.getParameter( ("qijuType")).getBytes("ISO-8859-1"), "utf-8");

    web程序开发中的URL乱码解决方案

    如果是在js中使用的超级连接,则要先把该超连接经过两次转换为十六进制的编码后再保存在一个变量中,即:var url=encodeURI("...");url=encodeURI(url);window.lo cation.href=url; (2).如果该超连接在页面中,可通过...

    JS的encodeURI和java的URLDecoder.decode使用介绍

    user=张三 可以使用js的encodeURI的URLDecoder.decode一起使用一起来把url加密下 (1)JS在页面上把数据var val = encodeURI(encodeURI(“要传到服务器端的是值”)); //调用2次encodeURI href=”<%=basePath%>...

    ajax中文乱码如何解决

    今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下...今天把问题解决了,很简单,是使用escape(或encodeURI,两个函数javascript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这是解决问题的关键

    JSP中js传递和解析URL参数以及中文转码和解码问题

    1.传递参数: 代码如下: var pmt = ‘sensor=’+ encodeURI(encodeURI(sensor))+’&device=’+encodeURI(encodeURI(device))+’&instrument=’; pmt += encodeURI(encodeURI(instrument))+’&n=’+n+’&addDate=’+...

    多文件上传例子(解决中文乱码)

    多文件上传例子,彻底解决中文乱码问题了。总结中文乱码问题如下: 1、所有页面都用UTF-8。 2、写过滤器,设置request.setCharacterEncoding("UTF-8")。 3、javascript脚本里用encodeURI(str)。 4、适当的时候,在...

    AJAX中文乱码问题探讨及解决

    AJAX中文问题分为两大类: 1)发送路径中的参数有中文,在服务器段接收参数值是乱码 例如: var url=”a.... //两次,很关键[具体为什么,我也不清楚] /********************************************/ 也有人写成var

    解决URL地址中的中文乱码问题的办法

    解决URL地址中的中文乱码问题的办法 ... 但是,在实际的开发和使用中,确是有乱码情况的发生,在后台的读取keyword信息为乱码,无法正确读取。 2. 乱码是如何产生的?  由于我们利用URL传递参数这种方式是依

    Request.QueryString 乱码问题

    Request.QueryString 获取的中文变乱码了,...1、html中,可以用js的 encodeURI() 方法将要传的中文处理,例如 encodeURI("I am 乱码") ,处理之后,字符串中的中文 “乱码” 两字将会被被十六进制的转义序列进行替换。

    js url传值中文乱码之解决之道

    在websphere 中使用的是url=encodeURI(encodeURI(url)); //用了2次encodeURI 测试成功,第一次转换没有尝试, 处理方法一。 js 程序代码:url=encodeURI(url);注意是整个URL 服务器端的代码:String linename = new ...

    从js向Action传中文参数出现乱码问题的解决方法

    经过实践发现下面的方法可以解决中文乱码问题: JSP的JS中:中文参数用encodeURI(encodeURI(中文参数)),经过两次转码。例如: 代码如下: function show(next,id,realName){ document.forms[‘f2’].action=”...

    jsp中URL传递中文参数的处理方法

    在页面的url中使用encodeURI(encodeURI(中文)),对中文进行编码,并在服务器的java程序中使用URLDecoder.decode(中文, “UTF-8”)进行解码即可; 如果url中需要传递+、#、?等特殊符号,可以使用encodeURIComponent...

    url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介

    解决url传递中文乱码问题,解决后台接收到的汉字是乱码的

    Ajax传递中文参数到后台乱码的有效解决方法

    使用Ajax传递中文参数,如果不对参数进行处理的话,传到后台会变成乱码,经测试可以使用如下方法 这里是以jquery.autocomplete插件中获取输入框中的数据传到后台为例: 注意要对中文使用encodeURI编码两次 代码如下:...

    小程序wx.uploadFile出现中文无法上传或者出现乱码

    出现中文无法上传或者出现乱码时可以参考一下这篇跳坑指南微信小程序联盟-uploadFile跳坑指南  里面讲的很详细了,这里归纳一下,解决方法:  在formData中对文字进行编码,使用encodeURI()  wxml中例:   ...

    c#自动判断URL编码方法

    URL中包含编码的中文的时候,程序获取queryString需要根据url的不同编码,采用不同的解码方式,RequestQueryString方法能够自动识别url是用UTF-8编码还是GB2312编码,从而自动获取争取的值。 应用范例:...

    js的encodeUri编码转换为GBK问题

    NULL 博文链接:https://forhope.iteye.com/blog/1771461

    【JavaScript源代码】基于网址URL中特殊字符转义编码.docx

    为什么需要Url编码 哪些字符需要编码 US-ASCII字符集中没有对应的可打印字符 保留字符 不安全字符 如何对Url中的非法字符进行编码 Javascript中的escape,encodeURI和encodeURIComponent的区别 安全字符不同 兼容性...

Global site tag (gtag.js) - Google Analytics