浅析WEB开发中的中文乱码问题

在开发 WEB 系统时,所要做的无非是浏览器和服务器之间不停地进行数据交互。当服务器向浏览器发送一段中文或者浏览器通过表单向服务器提交一段中文,如果不做适当处理,另一端获取的只能是乱码。乱码产生的本质原因就是因为编码和解码采用了不同的编码方式,要想解决中文乱码问题,就需要对 WEB 服务请求响应的编解码过程熟悉。

当浏览器向服务器请求的网页中包含有中文时,要想不出现乱码,很简单,只需要设置responsecontentType属性即可。

   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的属性值。在服务器端以何种方式解码呢,这个要按照提交方式不同而分别讨论了。向服务器提交内容的方式最常用的是GETPOSTGET将表单的信息放在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-1POST方式提交的内容是在消息体中,它不会受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

             
     

   以上阐述可以解释我在项目开发过程中所有遇见过的乱码问题,如果哪位兄弟遇见过除此之外乱码问题,请告诉我,以便使这篇文档更完整,不胜感激。如有雷同,不胜荣幸。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值