get提交时URL参数出现中文乱码解决方法
程序员文章站
2024-01-27 18:12:52
...
[size=medium][color=blue]在配合CRM做二期项目时,客户营销显示联系人时候,由于使用的get方式传递中文参数,导致新打开的jsp 获取参数为乱码。
第一次解决,js上是直接[/color][/size]
[color=blue][size=medium]jsp上获取参数是直接[/size][/color]
[color=blue][size=medium]由于我使用的是jetty容器,测试下来没问题,但是在测试服务器上测试时就发现,又出现乱码了。最终 解决方法如下:
js上修改为:[/size][/color]
[color=blue][size=medium]jsp上获取:[/size][/color]
[size=medium][color=blue]这样就可以了。。 仔细的人发现了,为什么要encodeURI 两次 不理解啊。。。
最后找原因如下:
一般情况下, 发送 encodeURI(parmeName);
接收时, 直接 String paramValue = request.getParameter(paramName); // 容器自动解码. 如果是jetty容器他会默认按照utf-8 系统默认字符集来解码。
我们知道 encodeURI 使用的是 UTF-8 编码规则来编的.
如果 request.getParameter(paramName) 时,容器也按 UTF-8 解的话,是正确的. 根本无须在客户端
进行二次的 encodeURI(...)
如果 request.getParameter(paramName),容器没有按 UTF-8 解的话, 结果只有一个,就是乱码!
容器按什么编码来解码,决定于 request.setCharacterEncoding(***) 或者 服务器程序配置.
如果你在 jsp 程序中,能够 request.setCharacterEncoding("UTF-8"), 并且 修改服务器配置,让容器在解 GET 提交的参数时,使用 UTF-8.
客户端提交前不用二次编码, 接收时,也只要直接 request.getParameter(paramName) 即可
---------------------
为什么网上会有人提出在客户端对字符串重复编码两次呢.
如果因为项目需要,不能指定容器使用何种编码规则来解码提交的参数, 比如:需要接收来自不同页面,不地编码的参数内容时。 (又或者是开发人员被这有点复杂的东东搞得晕头转向,不懂得如何正确的去做好这接收参数的工作)
这个时候,在客户端对参数进行二次编码,可以有效的避开“提交多字节字符”的这个棘手问题。
因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR1] 好了。[STR1] 是不带有多字节字符的)
再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR1])
然后,再在程序中实现一次 URLDecoder.decode 就可以得到想提交的参数的原值。[/color][/size]
第一次解决,js上是直接[/color][/size]
var xURL = "/hollycrm/hollycc/service/CRMSalesCallback.jsp?crmCustomerNo="+crmCustomerNo+"&callbackId="+callbackId+"&linkMan="+encodeURI(linkMan);,
[color=blue][size=medium]jsp上获取参数是直接[/size][/color]
String linkMan=request.getParameter("linkMan");
[color=blue][size=medium]由于我使用的是jetty容器,测试下来没问题,但是在测试服务器上测试时就发现,又出现乱码了。最终 解决方法如下:
js上修改为:[/size][/color]
var xURL = "/hollycrm/hollycc/service/CRMSalesCallback.jsp?crmCustomerNo="+crmCustomerNo+"&callbackId="+callbackId+"&linkMan="+encodeURI(encodeURI(linkMan));
[color=blue][size=medium]jsp上获取:[/size][/color]
String linkMan = StringUtil.killNull(request.getParameter("linkMan"));
linkMan=URLDecoder.decode(linkMan,"UTF-8")
;[size=medium][color=blue]这样就可以了。。 仔细的人发现了,为什么要encodeURI 两次 不理解啊。。。
最后找原因如下:
一般情况下, 发送 encodeURI(parmeName);
接收时, 直接 String paramValue = request.getParameter(paramName); // 容器自动解码. 如果是jetty容器他会默认按照utf-8 系统默认字符集来解码。
我们知道 encodeURI 使用的是 UTF-8 编码规则来编的.
如果 request.getParameter(paramName) 时,容器也按 UTF-8 解的话,是正确的. 根本无须在客户端
进行二次的 encodeURI(...)
如果 request.getParameter(paramName),容器没有按 UTF-8 解的话, 结果只有一个,就是乱码!
容器按什么编码来解码,决定于 request.setCharacterEncoding(***) 或者 服务器程序配置.
如果你在 jsp 程序中,能够 request.setCharacterEncoding("UTF-8"), 并且 修改服务器配置,让容器在解 GET 提交的参数时,使用 UTF-8.
客户端提交前不用二次编码, 接收时,也只要直接 request.getParameter(paramName) 即可
---------------------
为什么网上会有人提出在客户端对字符串重复编码两次呢.
如果因为项目需要,不能指定容器使用何种编码规则来解码提交的参数, 比如:需要接收来自不同页面,不地编码的参数内容时。 (又或者是开发人员被这有点复杂的东东搞得晕头转向,不懂得如何正确的去做好这接收参数的工作)
这个时候,在客户端对参数进行二次编码,可以有效的避开“提交多字节字符”的这个棘手问题。
因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR1] 好了。[STR1] 是不带有多字节字符的)
再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR1])
然后,再在程序中实现一次 URLDecoder.decode 就可以得到想提交的参数的原值。[/color][/size]
上一篇: 小程序实现授权登陆的解决方案