天天看点

开发中常见的中文乱码原因

在开发中,我们常常遇到中文乱码的问题,比如:

&浏览器中看到的 jsp/servlet 页面中的汉字成了 ’?’     

&浏览器中看到的 servlet 页面中的汉字都成了乱码    

&jsp/servlet 页面无法显示 gbk 汉字。

&jsp/servlet 不能接收 form 提交的汉字。

&jsp/servlet 数据库读写无法获得正确的内容。

隐藏在这些问题后面的是各种错误的字符转换和处理。解决类似的字符encoding问题,需要了解 jsp/servlet的运行过程,检查可能出现问题的各个点。下面是一些自己运用中的一些分享:

1.在jsp中如果指定了<%@ page contenttype="text/html; charset=a"%>,那么在该jsp中所有构造的string(不是引用),如果沒有指定编码,那么这些string的编码是a的;从request得到的string如果沒有指定request的编码的话,他是iso-8859-1的;从别的地方得到的string是使用原來初始的编码的,比如从数据库得到string,如果数据库的编码是b,那么该string的编码是b而不是a的,也不是系统默认的。此时,如果要输出的string的编码不是a,那么,很可能显示乱码的,所以首先要将string正確转化为编码a的string,然后输出。

2. 如果在jsp中沒有指定<%@ page contenttype="text/html; charset=a"%>,那么相当于指定了<%@pagecontenttype="text/html; charset=iso-8859-1" %>。

3. servlet中如果执行了语句:response.setcontenttype("text/html;charset=a");説明将response的字符输出流编码设置为a,所有要输出的string的编码要转化为a,否則会得到乱码。servlet中从request得到的string的编码和jsp中一样的,但是在servlet java文件中构造的string是使用的系统默认的编码的。在servelt中从外部得到的string是使用原来的编码的,比如从编码为b的数据库得到的数据是编码为b的,不是a,也不是系统默认的编码。

综上所属,要解决我们常见的中文乱码问题,需要理解数据交互中jsp, servlet, 数据库中数据的编码定义,统一编码格式或做适当转换。