乱码问题
乱码问题在JAVA平台的jsp/servlet中可以说是非常令初学者头痛的事,甚至很多"高手"都不知所措.
我先说明,乱码问题绝对没有一种通用的方法来解决绝,除非你你都用i18n来定义和用UTF来传传输,显示,但这是不可能的.我们只有根本不同原因来用不同的解决方案.
要从底层解决乱码,要求程序员要熟悉数据在网络上和内存中的每一个字节是来源和去向,这样才能从根本上解决.
产生的原因:
1:数据传输入过程中没有按协议格式化.
2:没有根据当前环境决定显示方式.
下面为了说明,我们只讨论汉字乱码产生的原因:
从客户端提交给服务端,对于POST传送,目前的浏览器都能正确编码,但QueryString方法是程序员控制的,很多程序员根本不对中文的URL格式化,直接用中文作为参数传送,对于IE6这样的智能程序高的浏览器可以自动格式化,而老版本的浏览器测原方传送,则服务器端程序不能正确地从标准输入中取得.应该先格式化编码。
如果网络上或内存中原如数据是正确的,但要用正确的方式从byte转换成系统能显示的字符集.假设"我"的byte表示为78,63(只是例子),但78,63有可能表示日文的ぬ,那你就要告诉系统,你当前的byte[] b表示的是什么字符集.而我所见过的jsp/servlet容器中除了resin在
getParameter()这个方法实现中都是return new String(b//byte[]);而没有指定字集.WLS我没的反编译,所以不知道它的HTMLUtil这个类在实现时是如何指定字符集还是没有。如果各种方法不能解决,我们只能对BEA不敬了,把ServletRequestWrapper类decode出来,在getParameter()方法中直接return new String(b,"GBK")得了.这样省得在XML中配置又不起作用。同样从数据库中如果取得的数据乱码,我们只要把JDBC的ResultSet类decode出来,把其中的getString(int column)方法中的return new String(b)方法都强行加上"GBK"
这样取数据保证正确了,然后再来解决显示的问题,即使你的数据在内存中是正确的,你也指定了正确的字符集参数,仍然不能保证你看到的是正确的,原因是系统知道这个编码是对的,但它没有这种字符集来显示,或你用来显示的字集不对.这就是JSP中<%@page contentType="text/html;charset=xxxx"%>的作用,有人以为光这样就正确了,你要知道这句和 response.setContentType("text/html;charset=xxxx");是一样的,只它是告诉浏览器我现在发给你的内容是用xxxx字符集来解释的,只能在从网络上或内存中取得的数据是正确的前提下才有用.现在servet也1.2也支持设置客户端字符集的方法了:setCharacterEncoding.
所以乱码问题绝不是一种方法能解决的,我们一定要知道它产生的原因,从底层来进行原始数据的转换才能解决.其实找原因也很简单,在HttpUtil中加一个直接getBytes()方法,把得到的原始数据看看是不是你你传过来的.比如从QueryString传过来"我"aaa.jsp?name=我,那你看看它的byte中是不是我的值,如果是,说明传送没有问题,不是就是没有格式化.一步步下来,总是不难解决的。