java获取浏览器编码_关于java web中的解码与编码

一.html表单,用get和post提交信息到servlet

1.626cebaeddc8866371c5ac73a95e89bd.png

①传输的中文信息,通过页面编码格式进行URL编码(也就是meta里面的charset的编码格式)传输到服务端

URL编码规则:

URL编码遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。

String xx = request.getParameter("xx");

服务端通过字符集来进行解码,而tomcat用的默认字符集是ISO-8859-1,所以如果这样子对所传过来的十六进制码进行解码的肯定是不对的(因为解码和编码必须对应可以参考http://wenku.baidu.com/view/14a91366caaedd3383c4d331.html)。如果现在直接在控制台输出xx的话得到的将会是乱码。那么该怎么才能获得我们需要的数据呢?

可以这样子

String xx = new String(request.getParameter("text").getBytes("iso-8859-1"),"aa")  (aa为html的页面编码格式)。这样在控制台打出就不会出现乱码了!(注意这里用request.setCharacterEncoding这个函数是不起作用的。)

每次这么弄也麻烦,那么就可以通过改变tomcat的这个默认的字符集编码。可以通过修改server.xml文件中的下面的语句,加上URIEncoding=“xx“(这里的xx为常用的html的页面编码格式)的配置即可:。

③.服务器把需要传输的信息通过编码传到客户端(浏览器),浏览器通过解码来获取信息!

这里又涉及到一个编码和解码,而在服务器端则默认使用iso-8859-1进行编码成byte,等到了浏览器,发现response的信息header中没有相关编码设置,就会去取window系统的编码格式,中文系统默认为GBK/GB2312。所以,打印出来的页面的浏览器编码格式为GB2312。而如果设置了response的编码格式,那么就算到了浏览器,浏览器解析也会按照设置的字符集解码。这里设置的方法可以有setContentType()和setCharacterEncoding()。response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置。

4.post方法请求页面

POST把提交的数据则放置在是HTTP包的包体中具体体现就是request信息中体现在Form Data中。

cdaad003c84fc5a99cfdf61f36460fd4.png

①传输的中文信息,通过页面编码格式进行URL编码(也就是meta里面的charset的编码格式)传输到服务端

URL编码规则:

URL编码遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。

String xx = request.getParameter("xx");

服务端通过字符集来进行解码,而tomcat用的默认字符集是ISO-8859-1,所以如果这样子对所传过来的十六进制码进行解码的肯定是不对的(因为解码和编码必须对应可以参考http://wenku.baidu.com/view/14a91366caaedd3383c4d331.html)。如果现在直接在控制台输出xx的话得到的将会是乱码。那么该怎么才能获得我们需要的数据呢?

可以这样子

String xx = new String(request.getParameter("text").getBytes("iso-8859-1"),"aa")  (aa为html的页面编码格式)。这样在控制台打出就不会出现乱码了!

这里也可以用request.setCharacterEncoding(“aa”)来设置编码格式!(这里修改server.xml就没有用了)

③.服务器把需要传输的信息通过编码传到客户端(浏览器),浏览器通过解码来获取信息!

这里又涉及到一个编码和解码,而在服务器端则默认使用iso-8859-1进行编码成byte,等到了浏览器,发现response的信息header中没有相关编码设置,就会去取window系统的编码格式,中文系统默认为GBK/GB2312。所以,打印出来的页面的浏览器编码格式为GB2312。而如果设置了response的编码格式,那么就算到了浏览器,浏览器解析也会按照设置的字符集解码。这里设置的方法可以有setContentType()和setCharacterEncoding()。response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置。

二.jsp作为客户端,用get和post提交信息到servlet

基本上和html的Get和Post的是一样的!但是有一个地方不同!那就是

jps的页面有3处地方涉及到编码与解码:1.pageEncoding 2.contentType 3.meta标签

那么作为客户端提交form表单的话,页面的编码的遵循顺序是contentType>pageEncoding,即如果contentType设置过了的话就用contentType,如果没有设置的话就用pageEncoding。meta标签暂时没有发现在这个过程中起到了什么作用!

三.jsp作为服务端处理信息。

当接受到正确的信息以后jsp服务端,就会对数据进行编码,然后传到浏览器,浏览器进行解码!那么这里面的编码和解码规则是怎么样呢?默认当然是iso-8859-1,和servlet是一样的,可以用setCharacterEncoding()方法,也可以用pageEncoding和contentType ,但是这里和html中不同的是setContentType()方法失效!并且setCharacterEncoding()>contentType>pageEncoding.

上述只是个人实验的结果,其中还有很多东西都没有弄懂原理,但是个人觉得知道了这些,在web编程里面一般的中文乱码就不会出现!如果有什么错误请指正,如果有什么补充和心得请留言,大家共同进步!不胜感激!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值