当浏览器向服务器请求的网页中包含有中文时,要想不出现乱码,很简单,只需要设置response的contentType属性即可。
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print("我在测试浏览器乱码问题");
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
其中charset的值设置成“GBK”,“GB2312”和“UTF-8”都是可以的,最好还是设置成“UTF-8”,这个是国际编码,前面两个是国标码,只适用于国内。response.setContentType的作用有两个:1、告诉服务器应该以何种编码方式对网页进行编码传输;2、在响应消息头中插入Content-Type:text/html;charset=utf-8 信息,浏览器通过这条信息,知道应该以何种方式来解码服务器发送过来的数据。从而保证中文正常显示。有人说,使用response.setCharEncoding()也能解决乱码问题,对此我只能说,如果你是通过这样解决乱码问题的,那只能说明你的运气还不错,因为response.setCharEncoding(),只能告诉服务器应该以何种编码方式来编码要传输的文件,却不能像response.setContentType()那样告诉浏览器以何种方式来解码所接收到的文件。不信你将浏览器的编码方式修改下再刷新,你的页面显示就是乱的。不过现在的浏览器越来越智能,可以根据服务器发送过来的数据自动选择合适的解码方式解码,在勾选这个“自动选择”选项的情况下,你也可以使用response.setCharEncoding()来解决乱码问题。选择前面一种解决方式应该是严谨的程序员的选择,呵呵。
当通过表单向服务器提交一段中文时,在后台要想正常获取中文内容,相比起上面要稍微复杂一些。向服务器提交中文内容,它到达服务器要经过两个阶段:1、在浏览器端编码发送;2、在服务器端解码接收。在浏览器端以何种方式编码呢,这就是我上面支持的采用response.setContentType来解决乱码问题的原因了,它所采用的编码方式就是charset的属性值。在服务器端以何种方式解码呢,这个要按照提交方式不同而分别讨论了。向服务器提交内容的方式最常用的是GET和POST。GET将表单的信息放在URL中,因此以GET方式提交的内容会被当做URL的一部分解码,这个设置在tomcat的配置文件server.xml中,如图所示:
<Connector
<span style="color:#ff0000;"> URIEncoding="utf-8"</span> port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
compression="on" compreesionMinSize="2" compressableMimeType="text/html,text/xml,text/javascript,text/css"
/>
如果缺省这个设置,那么默认的解码方式将是ISO-8859-1;POST方式提交的内容是在消息体中,它不会受URIEncoding解码的影响。它的解码方式目前我只知道通过request.setCharEncoding()这样来设置。如果不设置,默认的编码方式也是ISO-8859-1。知道了提交内容的编解码过程,解决它们就相当容易了。有两种方法:1、设置服务器解码方式,对以GET方式提交的内容,在tomcat的配置文件中配置其解码方式。对于以POST方式提交的内容,以request.setCharEncoding()来设置解码方式。2、逆编码:由上述分析可知,在不做任何设置的情况下,两种方式都是想先经过contentType设置的编码方式编码,再以ISO-8859-1方式解码。在服务器获取到数据后,先用ISO-8859-1编码,再通过ContentType指定的方式解码,也能使所提交中文正常显示,亦可。为证明我所言非虚,如下图所示:
<form action="/http/HttpCode" method="get">
<input type="text" name="name">
<input type="text" name="age">
<input type="submit" value="提交">
</form>
方硕璇-----23
以上阐述可以解释我在项目开发过程中所有遇见过的乱码问题,如果哪位兄弟遇见过除此之外乱码问题,请告诉我,以便使这篇文档更完整,不胜感激。如有雷同,不胜荣幸。