有关JSP和数据库乱码问题的处理方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,

相关文档
最新文档