这篇文章是对上一篇文章的补充
1.浏览器解析服务端页面的编码方式不再说。
2.浏览器端发送数据的编码格式:
1.javascript中
url编码解码encodeURI与encodeURIComponent 函数都是基于utf-8(默认处理,大家记住就可以了).这两个函数的区别我个人理解来说就是encodeURI是处理url的 ,而encodeURIComponent是处理url中每个参数的。
代码如下: var uri="my test.asp?name=stale&car=saab"; document.write(encodeURI(uri)); 上面的输出如下: my%20test.asp?name=st%C3%A5le&car=saab encodeURIComponent 代码如下: var uri="http://jb51.net/my test.asp?name=stale&car=saab"; document.write(encodeURIComponent(uri)); 上面的输出如下: http%3A%2F%2Fjb51.net%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab
2.除了url地址栏中数据的编码格式与环境有关系外,页面内的数据都采用了当前页面本身的编码格式(环境还是说,<meta http-equiv="Content-Type" content="text/html; charset=GBK">这里规定的格式)。 )
例如:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>Insert title here</title> <script type="text/javascript"> var url="http://servlet.do?a=你好&b=你好"; window.location.href=url; </script> </head> <body> </body> </html>
这个页面中的var url=。。。。。 url的编码格式就是GBK。
form表单中的数据同样的。小小总结:页面内部所有的数据编码格式都是Content-Type 决定的。
3.页面form post提交的数据处理如下:
application/x-www-form-urlencoded | 在发送前编码所有字符(默认) |
multipart/form-data | 不对字符编码。 在使用包含文件上传控件的表单时,必须使用该值。 |
text/plain | 空格转换为 "+" 加号,但不对特殊字符编码。 |
这个是http form规定
4.ajax get提交也就是url提交同普通的url提交一样。这里主要说的是post提交。ajax post提交没有遵循上面的表格。
它对提交的数据都没有进行编码。
5.通过分析上面几点,大家都浏览器端提交到后台的数据的编码格式都应该有了大概的了解。
3.下面说服务器解析数据
request.getParameter("")接收数据,首先进行一次解码(所有服务器都是如此,可能http协议要求)
既然是解码总得有个解码的方式吧:tomcat默认解码方式都是iso-8859-1,别的服务器大家自己看下。
1.对应get方式的请求,tomcat进行了一次默认的iso-8859-1解码(怎么更改tomcatget默认解码方式,大家自己上网搜索下巴),这个时候大家就可以根据客户端发送过来的编码类型进行操作了。
2.对应post方式的请求,
这里charset的值获得方式为如下两步:
(1)request.getCharacterEncoding("utf-8"),如果获得的编码格式不为空,好的,解码用这种格式(不走第二步了)如果获得的编码格式为空,好的只能进行第二步了
(2) 与服务器默认post解码格式 例如:tomcat解码默认为iso-8859-1.
3.着重说明一点:
举个例子:浏览器页面GBK格式编码 采用form post application/x-www-form-urlencoded 方式提交数据,,要发送数据假设为a ,那么发送前先对a编码为b,
tomcat服务器接受到数据b后,假设request.getCharacterEncoding("utf-8")编码格式为空。那么服务对b进行url解码(iso-8859-1.格式、) 假设为 B,此时得到的数据时什么样子呢, 是对数据a的iso-8859-1编码格式 假设为c (即:c=new String(B.getBytes(""GBK""),"iso-8859-1")),那么我们怎么样得到a的原始数据呢,将c还原为a 即:new String(B.getBytes("iso-8859-1"),"GBK");
4.着重说明
url解码过程不会对原始数据有任何损坏,具体还要大家自己多试验下了。
/**
* @param args */ public static void main(String[] args) { try { String username="http://servlet.do?a=你好&b=你好"; String dcodeuriusername=URLDecoder.decode(username, "UTF-8"); System.out.println(dcodeuriusername); //result: http://servlet.do?a=你好&b=你好 } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
总结:
1.主要关注点在于:浏览器端发送数据的元素原始编码类型,发送的数据是否进行了编码
大家只需要记住页面form post提交的数据
(application/x-www-form-urlencoded ----进行了url编码处理, text/plain----空格转换为 "+" 加号,
但不对特殊字符编码)。
即只有这两种form post提交的数据类型 进行了
编码处理其中application/x-www-form-urlencoded为正宗的url编码就可以了
2.服务器端接到数据后都进行了一次url解码处理,至于怎么解码就与相应的 web服务器与get post方式有关了。
服务端不采用默认url解码只有一种情况:
post提交并且request.getCharacterEncoding("utf-8")获得的编码格式不为空