JAVA请求与响应编码详解

在介绍编码问题前,先介绍一下java平台(JVM)上的编码转化情况。首先要说明的一点,在JVM中,即java平台上,运行的程序一定都是Unicode编码方式的。对于代码中的字符串常量,根据代码页的设置,转化为Unicode编码。对于输入,在输入进程序中JVM已经把输入的内容根据原先输入的编码方式转化为Unicode。若未指明,则是用系统默认的编码方式去转化为Unicode。对于输出,则是把Unicode编码按指定的编码方式输出,未指明则按系统默认编码输出。

web浏览器发送请求(request)
请求时要对此请求中的参数要进行编码传输
Get方式:浏览器会根据自己的页面的编码格式作为起始编码格式(右击菜单编码有显示的),把字符使用浏览器的编码格式编码成byte字节进行传输。到了tomcat容器,tomcat会使用URIEncoding进行重新编码(解码),如果tomcat没有配置的话,就会默认使用iso-8859-1对byte进行重新解码成字符。
Post方式:浏览器根据自己的页面的编码格式作为起始编码格式(右击菜单编码有显示的),把字符使用浏览器的编码格式编码成byte字节进行传输。到了tomcat容器,如果tomcat获取请求头中编码方式进行解码,若没有配置的话,就会默认使用iso-8859-1对byte进行重新解码成字符。
ajax方式:XmlHttpRequest对象的请求方式默认编码是UTF-8 ,当然可以重新设置,通过在Request Headers中设置Content-Type:application/x-www-form-urlencoded; charset=utf-8。为什么ajax和之前的不同呢?因为ajax不是使用默认的浏览器跳转提交方式,而是使用httprequest提交方式,默认跳转方式(get方式和post方式)会读取浏览器的编码格式,而httprequest不会,所以ajax就会设置自己的默认的编码格式进行提交(即UTF-8)。而使用ajax的post方法提交,无需再设定request的重新编码(解码)格式,因为request编码方式不再是默认的null(即request.getCharacterEncoding()不是默认的null),已经修改为UTF-8,所以不用转换直接拿出即为UTF-8格式;而对于get方法提交的话,需要参考tomcat的URIEncoding重新编码(解码)。

若tamcat中未重新配置编码方式,而要在java文件中正确显示获取的请求数据,则可以按如下方式获取(不包括ajax默认的post方式提交):

request.setCharacterEncoding("UTF-8");
String text = request.getParameter("text");
System.out.println(text);

String text = new String(request.getParameter("text").getBytes("ISO-8859-1"),"UTF-8");
System.out.println(text);

注意:自从Tomcat5.x开始,GET和POST方法提交的信息,tomcat采用了不同的方式来处理编码。对于POST请求,Tomcat会仍然使用request.setCharacterEncoding()方法所设置的编码来处理,如果未设置,则使用默认编码方式进行编码(解码)。而GET请求则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding()方法设置的编码,而会使用tamcat默认编码方式进行解码(解码)。


web浏览器发送响应(response)
get和post方式:response如果没有显式设置,tomcat又没有响应配置的话,不管request的编码是什么,response的编码就是ISO-8859-1。
ajax方式:使用的是response.responseText来进行获取信息,也就是说,也是需要使用到response的编码格式的。ajax不会再对该编码格式进行任何修改。只是接受而已。


其他:
jsp页面中的设定编码优先级:response.setCharacterEncoding--->contentType--->pageEncoding 层层覆盖 。
可缺省编码设置:pageEncoding--->contentType--->meta 默认缺省。pageEncoding写了后面的都可以不用写,默认继承。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值