编码

.HTML

<meta http-equiv="content-type" content="text/html;charset=utf-8">

作用:①影响该页面本身的编码,和在浏览器中的解码,比如汉字。②影响提交(post,get,url)的数据编码
.如果不写的话浏览器会用自己的默认charset解码,同时提交参数时也用该 编码,比如IE、chorm浏览器的页面默认charset都是GBK,但还是有些页面汉字显示正确,而有些页面显示不正确,这是为什么呢?这是因为.html文件的编码不同,在Myeclipse中,我们通过文件右键→properties→Resource中的text file encoding查看编码,如果选中的编码是GBK那么就可以正确解码,如果是utf-8,那么显示出来的如下:澶у濂斤紝鎴戞槸姹夊瓧(原文:大家好我是汉字)

.JSP

1.   <%@page pageEncoding="utf-8"  %>
2.    <%@page contentType="text/html;charset=utf-8" %>

.jsp执行过程如下:
这里写图片描述

一般情况下1或2单独使用时,另一个默认和其相同,所以效果一样,都能够影响浏览器的解码,当然从图我们得知它们为不同阶段的编码,两者一起使用更好。
jsp页面本身的解码优先级:response.setCharacterEncoding>contentType>pageEncoding
为什么response.setCharacterEncoding能影响jsp页面编码,从图知,一个Myjsp.jsp文件到网页的过程其实是分为三步,而网页是Myjsp_jsp.java(是一个servlet)通过response才打印出来,所以。

注意:
(1)提交参数(post、get、url)要进行编码:参数的编码优先级同jsp页面本身解码。

(2)获得参数要进行解码(包括jsp→jsp,jsp→←servlet):
①如果是post提交的参数,直接把request.setCharaceterEncoding放在getParameter之前,可获得提交的汉字;
②如果是url或get提交的参数,在使用request.setCharaceterEncoding前,需要在tomcat文件conf→server.xml中的:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443" /> 

.添加useBodyEncodingForURI="true"属性:表示允许request.setCharacterEncoding对url提交的数据和表单中get方式提交的数据进行重新编码;

.或则添加URIEncoding=”UTF-8”属性:表示直接定义所有项目的所有url和get数据的编码。

.如果为了方便移植,可以不用配置tomcat的方法,也不用request.setCharacterEncoding,直接用过滤器解决post,get,url,参数乱码:解决表单提交参数乱码问题【终极版】不看后悔

(3)回复数据时(指的是Servlet中的response.getWriter().println(“汉字”)):
response.setContentType直接影响了servlet对数据的编码浏览器对数据的解码;而response.setCharacterEncoding只能影响servlet对数据的编码,而数据的解码会根据浏览器而不同,如IE、Chorm,默认解码是GBK,所以如果setCharacterEncoding为GBK,那么就正确,如果为utf-8,那么就由于编码和解码字符不一致而错码。

(4) < meta …> 定义编码对JSP不起作用

(5)转码错误的几种情况:

String str=”你好”;
byte[] utf8Bytes=str.getBytes("utf-8");
String utf_gbkStr=new String(utf8Bytes,"gbk");
byte[] gbkBytes=str.getBytes("gbk");
String gbk_utfStr=new String(gbkBytes,"utf-8");
byte[] isoBytes=str.getBytes("iso8859-1");
String iso_gbkStr=new String(isoBytes,"gbk");
String iso_utfStr=new String(isoBytes,"utf-8");
System.out.println(utf_gbkStr);
//①:浣犲ソ,utf编码后gbk解码,两个字变三个字,因为utf8一个汉字占三位,而gbk占两位
System.out.println(gbk_utfStr);
//②:���,gbk编码后utf解码
System.out.println(new String(gbk_utfStr.getBytes("utf-8"),"gbk")); 
//③锟斤拷锟�,gbk编码utf解码,再次utf解码后gbk编码,解不开,不可逆
System.out.println(iso_gbkStr);
//③:??,ISO编码后gbk解码,解不开,
System.out.println(iso_utfStr);
//④:??,iso编码后utf8解码,解不开,

汉字的正确编码是:第一次编码必须使用gbk或utf8,第二次可直接用同样的编码解码;或则,第一次编码后用iso8859-1解码,再用iso8859-1编码,再用第一次编码时的charset解码(比如在servlet中得到汉字的参数,因为传过来的是String而不是byte[])

参考:

关于JSP页面中的pageEncoding和contentType两种属性的区别
解决表单提交参数乱码问题【终极版】不看后悔;
jsp中文乱码;
GBK,UTF-8,和ISO8859-1之间的编码与解码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值