乱码问题解决方法总结
乱码问题是在java的web应用中经常遇到的问题,因为报表是用java开发的,所以乱码问题经常出现在报表系统中。乱码问题大致可以分为7个方面:1.页面乱码;2.导出文件乱码;3.参数乱码;4.报表中文名乱码;5.olap内容乱码;6.填报乱码;7.日志文件乱码。不同的现象有不同的解决方法。
一.页面显示乱码
乱码问题处理流程图:
1.页面汉字显示乱码
现象:数据库中存储的内容不是乱码,但是用报表查询出来后,页面中汉字显示为乱码。
原因:数据库取数时没有转码
解决方法:在WEB-INF/reportConfig.xml文件中的dataSource节点,设置转码。
dataSource表示用户在WEB应用中要用到的数据源配置,其格式如下:
数据源的JNDI名称,数据库类型[,取数时是否需要转换编码,数据库字符集编码,显示报表时的字符集编码][,SQL是否需要转码];[重复]……。reportConfig.xml中的jspCharset节点设置、jsp页面设置<%@ page contentType=”text/html;charset=UTF-8″ %>和request.setCharacterEncoding( ”UTF-8″ )这几个charset最好设置成一样的编码。
2.统计图乱码
现象:统计图的报表在网页上发布时,统计图里的汉字会变成小方框
原因:是因为服务器端操作系统的中文安装包没有装全,导致报表里用到的字体在服务器端的操作系统里找不到,因此成了小方块。
解决方法:安装中文字体
(一)办法一、拷贝中文字体:
(1)、 在启动java的时候加入如下参数,参数值为jdk的安装路径 -Dsun.java2d.fontpath=……/j2se/jre/lib/fonts
(2)、 操作系统安装完整的中文安装包,然后把操作系统的中文字体文件拷贝到……/j2se/jre/lib/fonts目录下
(3)、 打开……/j2se/jre/lib目录下的font.properties文件,把新添加的字体文件的对照信息加进该文件即可
(4)、 重起webserver
(二)办法二、安装中文包:
(1)、 操作系统安装完整的中文安装包
(2)、 卸载jdk,重新安装,让jdk读取新的中文字体文件
总结:首先检查reportCongfig.xml中dataSource参数配置和jspCharset,以及页面编码设置,如果这几项都设置了,还是乱码,那就是中文字体没有安装全,在web服务器的操作系统上安装中文字体。
二.导出文件乱码
导出文件乱码处理流程图:
1.导出pdf乱码
应用部署在windows系统上导出pdf正常,部署在AIX系统上导出pdf出现乱码,原因是中文字符集没有安装全的缘故。
解决方法1:在设计器中将报表字体改为宋体。
解决方法2:同统计图乱码问题解决方法
2.导出excel乱码
如果客户导出excel乱码,很可能是客户用的jar比较旧,给客户更新report4.jar和poi2.jar包。
3.导出word乱码
如果客户导出excel乱码,很可能是客户用的jar比较旧,给客户更新report4.jar和itext2_rq.jar包。
总结:如果导出pdf乱码,查看一下服务器的中文字体是否安装全。报表对excel和word的支持的比较好,一般不会出现乱码,如何出现乱码,更换新包。
三.参数乱码
参数乱码处理流程图:
传参数的时候,经常会碰到乱码问题,下面对常见的几种解决方法做一下总结:
参数传到接收页面是否乱码,可以先让客户在接收参数的 jsp页面将接收到的参数打印出来,确认是否已经是乱码了。如果已经乱码了,有以下一些方法来解决。
1.在页面接受参数的代码前加上转码语句。 request.setCharacterEncoding( “GBK” );
2.客户页面的编码是utf-8 建议客户将接收到的参数进行转码 String name = new String(request.getParameter(“name”).getBytes(“gb2312”),”utf-8”);
客户页面的编码是GBK String arg1 = new String(request.getParameter(“arg1”).getBytes(“GB2312”),”GBK”);
3.http请求中,带参数 修改应用服务器的配置文件。如tomcat的server.xml文件 <!– Define a non-SSL HTTP/1.1 Connector on port 8080 –> <Connector port=”8080″ maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” redirectPort=”8443″ acceptCount=”100″ connectionTimeout=”20000″ disableUploadTimeout=”true” URIEncoding=”GBK”/> 加上最后的uriEncoding就OK了
4.做负载均衡的时候,参数乱码 修改应用服务器的配置文件。如tomcat的server.xml文件 <!– Define an AJP 1.3 Connector on port 8009 –> <Connector port=”8010″ enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ URIEncoding=”GBK”/> 加上最后的uriEncoding就OK了
注意:3 和 4 修改的是 server.xml 文件中不同的地方。
5.传递中文参数的时候,如果出现乱码,特别是双数中文正常,单数中文乱码的情况,可以尝试用如下办法解决: (1)、客户端编码,使用js方法 function encode(obj){ obj.value=encodeURI(obj.value); } (2)、服务端解码,使用java类方法 keyword = java.net.URLDecoder.decode(keyword, “UTF-8″);
总结:把上次说的3和4设置好,一般就不会出现乱码了。
四.报表中文名乱码
报表名为中文时乱码处理流程图:
1.报表名为中文时报错
报表名称为中文,报错
现象,报:读报表文件失败:????????±¨±í_arg.raq,web服务器为tomcat。报表名称是通过参数传递给jsp的,tomcat默认编码格式是ISO-8859-1,传递中文参数的时候容易产生乱码。解决方法:在tomcat的server.xml配置端口的地方添加URIEncoding=”GBK”。
总结:最好的解决办法就是不用中文命名报表。
2.打印乱码
报表名为中文名时打印出现乱码,现象:展现、导出正常,只是打印报“读报表文件失败”,如果客户用report4.jar是2009-04之前的,给客户更新report4.jar和runqianReport4Applet.jar,新版本问题已经解决。
五.Olap内容乱码
Olap内容乱码处理流程图:
现象:olap展示出来的效果中存在乱码
原因:页面没有设置编码,或页面设置编码不一致
解决方法:在jsp中增加“request.setCharacterEncoding( ”编码方式” );“,查看是否和jsp头“<%@ page contentType=”text/html;charset=编码方式” %>”设置的编码方式一致。
一个现象: jsp页面编写的很简单和咱们文档中的例子没什么差别,reportConfig.xml中的配置也没有问题,数据库编码也没有问题,这个问题的原因比较隐蔽,后来发现是客户编写jsp文件的时候默认存成了utf-8编码的文件。
解决方法:把发布olap的jsp另存为GBK编码的文件再发布问题就解决了。
六.填报乱码
填报问题处理流程图:
1.普通填报乱码
现象:填报表保存中文后,发现数据库中存放的是乱码。
原因:没有设置是否需要转码或设置的字符编码不正确
解决方法:在reportConfig.xml中的dataSource节点设置编码和是否需要转码,6个参数最好都设置上。
2. Excel导入乱码
现象:excel中含有汉字,导入保存后,发现数据库中存为乱码。
原因:字体设置不对或者编码设置不对
解决方法:如果普通填报表填报中文正常,就把单元格的字体设置为宋体。
七.日志文件乱码
处理流程图:
报表中log4j在英文版linux下输出中文日志为乱码。由于log4j配置文件(runqianReportLog.properties)中没有设置编码格式(encoding),所以log4j就使用系统默认编码,导致乱码。
解决方法是设置编码格式UTF-8,方法为:
log4j.appender.LOG1.encoding=UTF-8
如果添加后,还是乱码,就在服务器端安装中文字体。