传智播客Java web学习,jsp中的中文乱码问题

   在前面的学习中已经遇到过多次中文乱码问题,不明白其产生的原因,确实是一个很令人头痛的问题,跟张老师学了这部分后,明白了其中的原理,学习了解决方法,以后再遇到这类问题就好解决了。
jsp中的中文乱码
  java虚拟机中的字符文本编码采用Unicode编码,而输入输出设备通常采用其他的字符集编码。java程序在从外设的字节输入流中读取文本和将文本写入到外设的字节输出流时都需要进行字符编码的转换。还有Java程序中的一些字符文本是从java源文件中编译过来的,也要进行字符编码的转换,因为java源文件可能采用多种字符集编码。jsp页面要翻译成Servlet去运行的,所以,jsp中也存在同样的中文乱码问题。主要有三种:输出响应正文时出现的中文乱码问题;读取浏览器参数传递信息时出现的中文乱码问题;读写其他输入输出设备时出现的中文乱码问题。
  更详细一点的总结一下jsp乱码的可能性,
   1,Servlet程序从请求消息中获取请求参数和从数据库,文件,键盘等外设中读取一个字符串时都要将底层的字节流转换成字符串,但转换过程中指定的字符集编码与外设所输入内容的字符集编码不一致。应用程序从外设读取字符串的过程通常是调用第三方提供的api来完成,如果第三方api将底层字节流数据按照iso8859-1转换成字符串返回,那么对底层设备中的gb2312编码的中文字符来说,返回的将不是正确的Unicode码,那么再输出时就不能正确的转换成中文字符,会出现乱码问题。解决方法就是将返回的有问题的字符串按ISO8859-1还原成底层设备的原始字节数据,再将这些字节数据按gb2312编码转换成其Unicode码的字符串形式。
 strNew=new String(strOld.getBytes("ISO8859-1"),"GB2312");
 2,Servlet程序将字符串输出到浏览器,文件,和数据库时都要将字符串转换成底层的字节流,但转换过程中指定的字符集编码与外设使用的字符集编码不一致。
3,jsp引擎将jsp源文件翻译成Servlet时,其选择的字符集编码和jsp源文件中使用的字符集编码不一致。
     jsp引擎默认采用utf-8编码,而jsp源文件可以采用各种字符集编码,因此这个过程需要进行字符编码转换。jsp引擎在进行这种转换时,必须要知道jsp源文件说使用的字符集编码,才能将源文件中的字符文本转换成正确的utf-8字符集编码。这里jsp源文件的字符编码最好设置成utf-8,这样里面的中文字符按utf-8转换就能转换成正确的Unicode编码。输出时就不会出现乱码问题。如果不指定jsp源文件的字符集编码,其默认为iso8859-1,jsp引擎就会把其中的中文字符当做iso8859-1字符集编码转换成utf-8字符集编码,肯定会出现乱码。jsp的字符集编码可以在page指令中设置,page指令的pageEncoding 属性要比contentType属性的优先权高,所以最好在pageEncoding属性中设置字符集编码为utf-8.还有更高优先权的设置,即在web应用程序的部署描述符文件中可以设置
 <jsp-config>
    <jsp-property-group>
          <url-pattern>/jsp/*</url-pattern>
           <page-encoding>utf-8<page-encoding>
    </jsp-property-group>
</jsp-config>
这样在jsp目录下的所有jsp文件的字符集编码都设置为了utf-8.
4,jsp引擎将jsp源文件翻译成Servlet时,其选择的字符集编码和servlet源文件中使用的字符集编码不一致。

总结上述jsp中文乱码问题的原因,解决的方法就是在jsp源文件中明确指定字符集编码为utf-8 或gb2312。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值