一、html
1、tomcat中的静态文件的比如:html文件的响应头中Content-Type的为text/html;
则编码是浏览器根据算法计算html的编码。如果在web.xml中设置(设置方法见2)了编码的服务器中则返给浏览器的响应头中Content-Type的值为
text/html; x(设置的编码)。
2、在tomcat的web.xml中设置
<mime-mapping>
<extension>html</extension>
<mime-type>text/html; charset=utf-8</mime-type>
</mime-mapping>
3、在aphce中也可以设置。
4、eclipse中html的保存编码默认是根据head中的
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
决定的。也可以右键指定保存编码。
5、如果html的保存编码(由4决定)和2中设置的不一样则出现乱码。说明tomcat向客户端(主要是浏览器)输出静态文件html时的编码方式是html的保存编码。
6、html中的head中的
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
也不能决定浏览器用什么方式解码,这个是用作当用户把也没保存在本地时用浏览器打开是用什么方式解码。ie浏览器在把html保存为本地文件时会根据
改变服务器输出的html的中
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
的值。
HTTP响应头
建议
1.HTTP响应头较之元标记参数更好
有几种为HTML文档指定字符集的方式:
服务器端:为类型为text/html的文档的Content-Type头的charset参数指定正确的字符编码,例如:Content-Type: text/html; charset=UTF-8。
客户端:在HTML中包含具有http-equiv=”content”属性的meta标签,并指定charset参数。例如:<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
如果可能,在服务器指端指定HTTP头的字符集。如果在HTTP头中字符集已经被指定,那么部分浏览器(比如火狐)将会减少运行JavaScript前的缓冲时间。因为它们不再检查HTML文档中的<meta>。
2.在head的最前端指定<meta>
如果你无法控制服务器,你就需要在用meta设置字符集,并且保证<meta>在head的最前端。浏览器在文档的前1024bytes内搜索charset参数,从而避免性能的降低。charset参数应该尽可能早的被定义!
3.一定要定义content type
浏览器只有在确定待处理文档的content type后才能开始检查字符集。如果在HTTP头和<meta>中没有指定字符集,浏览器将会试图通过各种算法“嗅探”content type。这个过程将指定额外的延迟。而且这可能引起安全方面的问题。处于安全和性能两方面的考虑,你应该为所有资源指定content type。
4.确保指定正确的字符编码
在HTTP头或<meta>中指定的字符集必须和你用来组织HTML的字符编码相同。如果你在HTTP头和<meta>中都指定了字符集,那么保证他们是一致的。如果浏览器发现错误或不匹配的编码,他将错误的渲染页面和/或导致额外的重绘页面的延迟
总结:浏览器的解码方式其实浏览器根据响应头和http-equiv确定,响应头优先级高,响应头是由web.xml中的设定的。tomcat发给浏览器的编码是由html保存的编码决定的。最好的设置方式是明确设定
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
eclipse按照此设置保存文件,tomcat再按照eclipse的保存html文件的方式设置编码将数据流发送到浏览器,明确设置web.xml中的中的编码因为这样可以不用浏览器判断解码方式,提高效率。
二、jsp
1、浏览器的解码方式由
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="utf-8"%>
中的charset确定,设置的
<mime-mapping>
<extension>html</extension>
<mime-type>text/html; charset=utf-8</mime-type>
</mime-mapping>
也没用。
2、如果不指定
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="utf-8"%>
中的charset 由pageEncoding确定的,如果保存方式跟pageEncoding不一样,则以pageEncoding为准,如果没有设置pageEncoding则默认为ISO-8859-1。跟
<mime-mapping>
<extension>html</extension>
<mime-type>text/html; charset=utf-8</mime-type>
</mime-mapping>
没关系。
总结:浏览器的解码方式其实浏览器根据响应头和http-equiv确定,响应头优先级高,响应头是由charset和pageEncoding确定的,charset优先。如果两者都没有这默认ISO-8859-1。所以说跟html中head中的<META content="text/html; charset=utf-8" http-equiv=Content-Type>无关。
三、get请求将中文字符等不是能用iso-8859-1进行编码的字符,先选一种合适的编码方式(中文肯定不能用ISO-2022-JP)将参数编码为用%隔开的两位一组的对该参数编码之后的十六进制数字,在浏览器地址栏中看到的是该组数字或中文汉字,但浏览器传给服务器的是该组数字对应的二进制数字而不是该字符串经iso-8859-1进行编码后的二进制数,其他的参数传给服务器的是经iso-8859-1进行编码后的二位数
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="gbk" />
如果不设定默认为iso-8859-1,一般不设定因为设定后将对该服务中所有的应用发生作用,而是已下面的方法解决该问题
http://blog.csdn.net/lwwgtm/article/details/30800463