|
也不知道是怎么了,在Java Web应用中我经常会碰到乱码问题。今天整整花了一下午的时间特意去解决这个问题,结果收获颇丰。下面是我的心得,写出来供大家分享。
首先解释一下经常遇到的几种编码:
ISO8859-1:属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。
GBK2312/GBK: 汉字的国标码,专门用来表示汉字,是双字节编码。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。
UNICODE: 这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。
UTF:utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
了解了几种编码后,我们要考虑怎样来统一编码以及解决中文乱码问题了。WEB应用中编码问题主要分为两大类。第一类,Post请求时的编码问题,由于Post请求是传递数据是在请求体中,其编码和页码编码一致,所有比较容易搞定,以页面编码为GB2312为例,服务器短取数据时只要使用request.setEncodingChartset("gb2312")设置就行。第二类,Get请求,由于Get请求是使用URL传参,而Url参数的编码与客户端浏览器设置有关(具体是怎么回事我还没搞清楚)。
下面说一下我解决中文乱码的心得:第一,修改Tomcat的server.xml配置文件
<Connector port="8888" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
URIEncoding="gbk"/>
这是修改后的配置文件,注意最后一行,这应该是解决Get请求时对RUL进行编码,具体什么意思没深研究。
第二,对与统一所有请求和响应的编码最好的办法是使用过滤器
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("gbk");
response.setContentType("text/HTML;charset=gbk");
chain.doFilter(request, response);
}
这是过滤器的doFilter方法,将请求和响应的编码都设置为GBK(和页码编码一致)。
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>common.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这是过滤器的配置文件。
总结:java的编码问题是个很头疼的事情,以后发现其他好的方法,或新的编码问题再补充。 |
|