有关JSP和数据库乱码问题的处理方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JSP乱码终极解决方案(2)2008-09-27 01:53 A.M
2,具体说来,需要哪些信息才能确定项目中的乱码的根源.
a,开发者所用的操作系统
b,j2ee容器的名称,版本
c,数据库的名称,版本(精确版本)以及jdbc驱动的版本
d,出现乱码的source code(比如是system out 出来的,还是jsp页面中的,如果是jsp中的,那么头
部声明的情况也很重要)
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的,那就……
b,如果用上面的步骤能得到正确的中文,说明你的数据肯定是在的,只不过是界面中没有正确显示而
已.那么第二步就该纠正你的view部分了
,通常需要检查的是jsp中是否选择了正确的页面编码.
在此要声明被很多人误解的一点,那就是<%@ page contentType="text/html; charset=GB2312〃%>
指令和
content="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 的character
set,每个table,column都可以指定编码
,不指定就是ISO8895_1,因此jdbc取出数据后会根据column的character set来进行编码,
而不再是用
一个全局的参数来取所有的数据了.
这从另一个方面也说明了乱码问题的产生实在是很复杂的事情,原因太多了.我也只是针对自己遇
////////////////////////////////////////////////////////////////////////////////////////
jsp中文问题解决之道[转载]
和Java一样,JSP是目前比较热门的一个话题.它是一种在服务器端编译执行的Web设计语言,因为脚本
语言采用了Java,所以JSP继承了Java的所有优点.可是在使用JSP程序的过程中,常遇到中文乱码问题
,很多人为此头疼不已,初学的时候我就深受其害,而且使用平台不同,中文乱码问题的解决方法也不
同,无形中增加了学习JSP的难度.其实,在彻底了解相关原因后,问题还是比较容易解决的.,以下
是我总结的解决方法,相信对读者会有一定的借鉴意义. (因为我使用得最多的是Tomcat 环境,所以
主要是以Tomcat为例,其它的环境只会提及一下,但解决办法也是差不多的!
每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码、中国的GB2312
-80、日本的JIS 等,作为该国家(区域)信息处理的基础,有着统一编码的重要作用.由于各本地字
符集代码范围重叠,相互间信息交换困难,软件本地化版本独立维护成本较高.因此有必要将本地化工
作中的共性抽取出来,做一致性处理,将特殊的本地化处理内容降低到最少,这就是所谓的国际化
(I18N).各种语言信息被规范为本地信息,而底层字符集采用包含了所有字符的Unicode.
相信了解JSP代码的读者对ISO8859-1一定不陌生,ISO8859-1是我们平时使用比较多的一个CodePage,