欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

get提交时URL参数出现中文乱码解决方法

程序员文章站 2024-01-27 18:12:52
...
[size=medium][color=blue]在配合CRM做二期项目时,客户营销显示联系人时候,由于使用的get方式传递中文参数,导致新打开的jsp 获取参数为乱码。
第一次解决,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]
相关标签: jsp JavaScript