JSP页面显示中文乱码的解决方案

在使用JSP的过程当中,最令人头疼的一个问题就是中文乱码问题,要解决这个问题首先要知道问题出在哪里,而后再找解决方案,下面就列出了具体的步骤,只要按如下步骤去作,解决JSP页面显示中文乱码的问题就很容易了。html

1,首先developer要明确本身为何会遇到乱码,遇到什么样的乱码(无心义的符号仍是一串问号或者其它什么东西)。新手遇到一堆很乱的字符时一般不知所措,最直接的反映就是打开google搜索“java中文”(这个字符串在搜索引擎上的查询频率很是高),而后一个一个的去看别人的解决方法。这样作没有错,可是很难达到目的,缘由下面会提到。总之,出现乱码的缘由是很是多的,解决的方法也彻底不同,要解决问题必须先分析本身的”上下文环境”。java

2,具体说来,须要哪些信息才能肯定项目中的乱码的根源。
a,开发者所用的操做系统
b,j2ee容器的名称,版本
c,数据库的名称,版本(精确版本)以及jdbc驱动的版本
d,出现乱码的source code(好比是system out 出来的,仍是jsp页面中的,若是是jsp中的,那么头部声明的状况也很重要)mysql

3,如何初步分析乱码出现的缘由。
有了上述的信息,基本上就能够发帖求助了,相信放到javaworld等论坛上,很快就会有高手给你提出有效的解决方案的。固然不能总靠发帖求助,也要试试自行解决问题。如何下手呢?
a,分析一下你的“乱码”究竟是什么编码。这个其实不难,好比
System.out.println(testString);
这一段出现了乱码,那么不妨用穷举法猜想一下它的实际编码格式。
System.out.println(new String(testString.getBytes(”ISO-8859-1〃),”gb2312〃));
System.out.println(new String(testString.getBytes(”UTF8〃),”gb2312〃));
System.out.println(new String(testString.getBytes(”GB2312〃),”gb2312〃));
System.out.println(new String(testString.getBytes(”GBK”),”gb2312〃));
System.out.println(new String(testString.getBytes(”BIG5〃),”gb2312〃));
等等,上述代码的意思是用制定的编码格式去读取testString这个”乱码”,并转换成gb2312(此处仅以中文为例)而后你看哪个转换出来的结果是ok的,那就。。。sql

b,若是用上面的步骤能获得正确的中文,说明你的数据确定是在的,只不过是界面中没有正确显示而已。那么第二步就该纠正你的view部分了,一般须要检查的是jsp中是否选择了正确的页面编码。在此要声明被不少人误解的一点,那就是<%@ page contentType=”text/html; charset=GB2312〃 %>指令和<META http-equiv=Content-Typecontent=”text/html; charset=gb2312〃>二者的不一样。一般网上的不少文章在提到中文问题时都是说数据库中选择unicode或者gb2312存储,同时在jsp中用page指令声明编码就能够解决。可是我以为这种说法很不负责任,害的我费了N多时间为原本并不存在的乱码而郁闷。实际上page的做用是在jsp被编译成为html的过程当中提供编码方式让java来”读取”表达式当中的String(有点相似于上面的第三个语句的做用),而meta的做用是众所周知的为IE浏览器提供编码选择,是用来”显示”最后的数据的。可是没有看到有人提醒这一点,我一直把page当成meta在用,致使原本是iso-8859的数据,被page指令读gb2312,因而乱码,因此又加了编码转化的函数把全部的string数据都从iso8859转到gb2312(为何这么转,当时也没考虑这么多,由于这么作能够正常显示了,因此就这么改了,呵呵当时实在没有时间慢慢排查问题了)。数据库

4,数据库选择什么样的编码比较好。
目前流行的DB主要有sql server,mysql,oracle,DB2等,其中mysql做为免费DB中的老大,性能和功能是获得公认的,安装配置比较方便,相应的driver也比较完善,性价比是绝对的OK。因此就以mysql为例。我我的建议采用mysql的默认编码来存储,也就是iso-8859-1(在mysql的选项中对应于latin-1)。理由主要有这么几个,一是iso-8859-1对中文的支持不错;二是跟java中的默认编码一致,至少在不少地方免除了转换编码的麻烦;三是默认的比较稳定,兼容性也更好,由于多编码的支持是由具体的DB产品提供的,别说跟其它的DB会不兼容,即便自身的不一样版本也可能出现兼容性的问题。浏览器

例如mysql 4.0之前的产品中,不少中文的解决方案是利用connection中的characterEncoding字段来制定编码,好比gb2312什么的,这样是ok的,由于原数据都是ISO8859_1编码,jdbc驱动会采用url里面指定的character set来进行编码,resultSet.getString(*)取出的就是编码后的字符串。这样就直接拿到gb2312的数据了。可是mysql 4.1的推出给不少dbadmin带来了不小的麻烦,由于mysql4.1支持column level的characterset,每一个table,column均可以指定编码,不指定就是ISO8895_1,所以jdbc取出数据后会根据column的character set来进行编码,而再也不是用一个全局的参数来取全部的数据了。oracle

总之,遇到 JSP页面显示中文乱码的问题,必定不要急,要先分析出缘由再找解决方案,这样不但能节省不少时间,并且之后再遇到这个问题就很容易处理了。jsp

相关文章
相关标签/搜索