传智播客Java web之 乱码问题

     不管是在写Servlet还是JSP应用程序,只要不是西欧ISO8859-1字符集编码,都将会遇到乱码问题。每当遇到乱码问题,如果不懂这些字符集的转换原理,调试起来是相当的困难。在JAVA WEB系列视频中,有几个章节都讲述了字符集的问题以及在实践中应该怎么解决乱码问题。
    首先一个遇到乱码的问题就是请求参数。常遇到的当然是中文字符的乱码问题。请求参数是被浏览器经过URL编码才发送给服务器的。因此要解决请求参数的乱码问题就应该了解一下URL编码的相关知识。如果程序内部需要传递URL参数,就需要了解JAVA本身的URL编码问题。对Java中的某个字符串进行URL编码,其实是在对它的某种字符集编码(非Unicode码)数据进行URL编码,而Java中的字符串是以Unicode字符集编码存在的,所以,在对Java中的字符串进行URL编码时,必须指定是对这个字符串的哪种非Unicode的字符集编码进行URL编码。JDK的java.net包中有两个类:URLEncoder和URLDecoder,URLEncoder类中定义了一个encode静态方法来完成URL编码,URLDecoder类中定义了一个decode静态方法来完成URL解码。浏览器对表单中输入的中文字符都会进行URL编码后再传送给WEB服务器。对于页面中的FORM表单中输入的内容,浏览器将按照当前显示页面时所采用的字符集编码来进行URL编码。解决请求参数乱码问题常用的方法有getCharacterEncoding方法和setChargetParameter方法。视频中对getParameter方法的中文问题做了如下总结:
      1.getParameter等方法在读取的参数信息时,需要进行URL解码。
      2.对于HTTP请求消息的请求行中的URL地址后的参数,getParameter等方法进行URL解码时所采用的字符集编码在Servlet规范中没有明确规定Tomcat中的ServletRequest对象的getParameter等方法默认采用ISO8859-1字符集编码进行URL解码,因此无法返回正确的中文参数信息。
      3.对于POST方式下的"application/x-www-form-urlencoded"编码格式的实体内容,getParameter等方法以ServletRequest对象的getCharacterEncoding()方法返回的字符集编码对其进行URL解码。
      4.getCharacterEncoding()方法的返回值通常为null,对于这种情况,ServletRequest对象的getParameter等方法将使用默认的ISO8859-1字符集编码对实体内容中的参数进行URL解码,因此也将无法返回正确的中文参数信息。
      5.ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称,getParameter方法将以该方法设置的字符集编码对实体内容进行URL解码。
      6.setCharacterEncoding方法设置的是请求消息中的实体内容的字符集编码名称,它只影响getParameter方法对POST方式下的"application/x-www-form-urlencoded"编码格式的实体内容进行URL解码的结果,而不能影响getParameter方法对HTTP请求消息的请求行中的URL地址后的参数进行URL解码的结果。
    其次就是输出响应的乱码问题。对于Servlet的中文输出问题,因为ServletResponse对象的getWriter方法返回的PrintWriter对象默认使用ISO8859-1字符集编码进行Unicode字符串到字节数组的转换,由于ISO8859-1字符集中根本就没有中文字符,Unicode编码的中文字符将被转换成无效的字符编码后输出给客户端。因此要解决这一块的乱码,可以用到在ServletResponse接口中定义的setCharacterEncoding、setContentType和setLocale等方法来指定ServletResponse.getWriter方法返回的PrintWriter对象所使用的字符集编码。调用ServletResponse接口中定义的setContentType方法,在HTTP响应消息的Content-Type头字段中指定响应正文的字符集编码。
    最后就是JSP的乱码问题,因为Servlet的是JSP的基础,所以JSP程序存在有与Servlet程序完全相同的中文乱码问题。另外因为JSP要翻译成Servlet,所以JSP又多了一个导致乱码的原因。JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。所以,如果JSP得字符集设置错误,乱码问题将不会解决。解决JSP引擎翻译JSP页面时的中文乱码问题有三种方式:
      1.通过page指令的contentType属性说明JSP源文件的字符集编码
      2.page指令的pageEncoding属性说明JSP源文件的字符集编码
      3.在部署描述符中说明一组JSP源文件的字符集编码
          <jsp-config>
              <jsp-property-group>
                  <url-pattern>/jsp/*</url-pattern>
                  <page-encoding>GB2312</page-encoding>
              </jsp-property-group>
          </jsp-config>
JSP中文乱码的总结分析:
      1.Servlet程序从请求消息中获取请求参数和从数据库、文件、键盘等外设中读取一个字符串时都要将底层的字节流转换成字符串,但转换过程中指定的字符集编码与外设所输入内容的字符集编码不一致。如果某个第三方API将底层设备中的字节流数据总是按ISO8859-1转换成字符串返回,那么,对于底层设备中的GB2312编码的中文字符来说,返回的将不是其正确的Unicode码,这时候可以通过如下语句来解决:
   strNew = new String(strOld.getBytes("ISO8859-1"),"GB2312");
      2.Servlet程序将字符串输出到浏览器、屏幕、文件和数据库时都要将字符串转换成底层的字节流,但转换过程中指定的字符集编码与外设所能显示的字符集编码不一致。
      3.JSP引擎将JSP源文件翻译成Servlet源文件时,其选择的字符集编码与JSP源文件实际使用的字符集编码不一致。
      4.JSP引擎编译由JSP源文件翻译成的Servlet 源文件时,其选择的字符集编码与Servlet 源文件的字符集编码不一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值