标签:
在浏览器和服务器之间,传输数据时,会涉及到转码问题,本文介绍一下具体的情况。
一、类型
传输类型有三种会有转码问题(WebSocket没有此问题),包括Cookie和GET,POST。
a、Cookie
在客户端Cookie的东西不会被转码,但一旦传输到服务器去,会被自动地encodeURIComponent,服务器解析一次,因此被还原,但其中的value不能有";",否则cookie会错误,也不能有中文,当然如果想传递这些,请赋值时调用encodeURIComponent,然后服务器调用解码一次。
b、GET和POST
GET和POST的东西并没有被转码(其实根据设置而定,设置了转码也仅仅是全部内容转码,而不是单VALUE转码,仍然面临value中含特殊字符的问题),因此如果不转码而可能造成不符合?key=value&key2=value2的格式,所以需要自己注意,否则可能服务器不能识别。
二、加码和解码
a、escape&unescape
将进行多数数据的转码,但不包括"-_.!~*‘()"以及数字和字母,其他都将被转为%xx或者%uxxxx的模式。但不推荐,已经被标准废弃
b、encodeURI&decodeURI
不转码"-_.!~*‘()"也不转码“;/?:@&=+$,#”和数字字母,其他都被转码为%xx。用于在地址栏使用,因为他不转码和URL相关的任何字符,比如http://www.xxx.com/default.html?abc=value&def=value2#,会完全保留下来,但注意需要转码value的内容,否则可能格式不正确,且注意value的值不能用encodeURI转码,否则诸如+号是不会被转码的,但提交到服务器会是被为空格,还比如&也不会,会造成服务器识别错误。
c、encodeURIComponent&decodeURIComponent
和encodeURI的区别是会转码“;/?:@&=+$,#”,其他没有区别。它的特点就是可以支持转码内容,让需要传输的内容不会影响URI的地址也不会影响传输的数据格式,用于纯数据时用,但不能用来转码地址,否则该地址必须解码一次,不然无法访问。http://www.xxx.com/default.html?abc=value&def=value2#会被转码为http%3A%2F%2Fwww.xxx.com%2Fdefault.html%3Fabc%3Dvalue%26def%3Dvalue2%23。
三、服务器(ASP.NET)
服务器收到的数据时会进行必要的解码工作,且使用的是UrlDecode(即全部解码,对应encodeURIComponent,encodeURI对应的是UrlPathDecode),但需要注意的是有的符号会被特殊转码,比如“+”会被转为“ ”空格,“&”会被当作分隔符而不见,这就是为什么客户端传值时需要转码一次了,否则没有转码的符号就会造成某些错误结果。
四、总结
其结果就是如果需要数据和服务器之间通信(GET&POST),则建议对所有的数据内容(即value内容,而不包含key,当然包含了也没事,反正key通常是符合规范的内容,但不能转“=”),进行encodeURIComponent加码,服务器收到后读取时就是已经解码的了,不需要再解一次,同时对cookie则浏览器会自动转码,而服务器却不会解码,需要自己解一次。
1、浏览器发送时,需对GET&POST所有value转码,cookie会自己转;
2、服务器接收时,会对Cookie、GET和POST都进行解码一次;
3、浏览器接收时不需要任何解码,会和服务器发送的一样;同理,服务器发送不需要转码,除非特殊需要;
4、AJAX时,如果传递时是FORM,则可以设置其属性来确认是否让其帮助转码(enctype="multipart/form-data") ,但没有任何意义,仅用于区分是文本还是文件传输,见http://www.cnblogs.com/21tcy/p/4814673.html。
标签:
原文地址:http://www.cnblogs.com/21tcy/p/5054880.html