润乾报表在不同IE钻取等中文参数乱码几种解决方案

1. 问题概述
最近遇到很多客户都有中文传参乱码的问题,这里整理一下:
客户A:在润乾报表中用到了超链接链到另一张报表,链接中有传递中文参数,在设计器的IE预览中,参数传递均正常,但是布署到服务器后,中文变成了乱码,更改ReportConfig.xml中的字符集,亦无济于事
客户B:当我们JSP页面编码格式为UTF-8,而在该页面使用了参数填报表单时,从页面输入中文参数为奇数个时,在后台接参数部分乱码成符号(??)
2. 基本原因 原因: A:服务器整体编码不统一
B:造成该原因是因为页面使用UTF-8编码,而参数表单内部的报表参数池是GBK编码,造成了编码不统一而导致的.下面将对编码细节进行详细分析
C:通过URL传参后,如果参数是中文字符且中文字符数为基数时,最后一个字符就会出现乱码,这主要是由于IE6不能完全支持UTF-8编码造成的.
以上情况等等都会出现中文参数传递乱码的问题, 3. 编码过程分析
1)JSP->tomcat:当浏览器向WEB容器tomcat发送请求时,这时页面编码为UTF-8,而tomcat默认编码采用的是ISO-8859-1(当然我们也可修改tomcat编码与页面统一,这样在通过tomcat之后接中文参数就不用转码了,不过不建议修改tomcat编码,因为那样就得保证所有页编码与tomcat保持一致) 参数到达tomcat,tomcat将参数进行ISO-8859-1编码。
2)tomcat->报表:当参数到达报表时,报表采用内置的GBK编码,此中文参数乱码. 因为UTF-8对汉字编码是三字节的,而GBK对汉字编码是两字节的.所以new String(tomcat.getBytes(“ISO-8859-1″),”GBK”);不能将参数转回页面UTF-8格式的中文参数了。
3)报表->servlet:当参数到达servlet,此时我们要将参数编码还原到页面时的编码 此时还是会乱码.因为GBK对汉字编码是双字节的,而UTF-8是三字节的。所以new String(raq.getBytes(“GBK”), “UTF-8″);不能将中文参数回转了。
4)在JSP(UTF-8)->tomcat(ISO-8859-1)->servlet流程下,当我们使用URL方式传递中文参数的时候,我们在servlet解决乱码常用办法是:new String(str.getBytes(“ISO-8859-1″),”UTF-8″);正是使用的JSP->tomcat的反向编码将参数还原到页面时的编码。
4. 几种解决方案
方法1:在参数接收之后强制转码为GBK;以showReport.jsp为例:

Enumeration paramNames = request.getParameterNames();

if(paramNames!=null){

while(paramNames.hasMoreElements()){

String paramName  = new String(((String) paramNames.nextElement()).getBytes(“iso-8859-1″), “GBK”);

String paramValue = new String(request.getParameter(paramName).getBytes(“iso-8859-1″), “GBK”); }}}

方法2: 利用加解密的方式,加解密程序可以根据情况自己定义,附件提供一种加解密方式:

A方式:

加密:Base64Encode(要传递的参数),加密你要传递的参数.

解密:Base64Decode(接收的参数),在showReport.jsp里:

if(paramValue!=null){

//把参数拼成name=value;name2=value2;…..的形式            param.append(paramName).append(“=”).append(Encrypt.Base64Decode(paramValue)).append(“;”);}

B方式:利用JAVA自带的方式

传参前:使用java.net.URLEncoder.encode(参数,”GBK”),将中文转为16进制字符。

接收参数后:使用java.net.URLDncoder.decode(参数,”GBK”)将16进制字符转为中文。

 

方法3: 情况允许下,在tomcat,conf目录下,修改server.xml里:

<Connector port=”8080″ maxHttpHeaderSize=”8192″                maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″                enableLookups=”false” redirectPort=”8443″ acceptCount=”100″                connectionTimeout=”20000″ disableUploadTimeout=”true” URIEncoding=”GBK”/>

方法4: 情况允许下,使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式.

标签: