0
点赞
收藏
分享

微信扫一扫

请求方法get和post的在URL encode编码方面的区别以及乱码问题

get提交

一、客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的?

1、对于get方法来说,都是把数据串联在请求的url后面作为参数,如:​​http://localhost:8080/servlet?msg=abc​​

2、很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:​​http://localhost:8080/​​ /servlet?msg=杭州,服务器端容易得到乱码。

3、url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器。URL encode的过程就是把部分url作为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字 符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。

4、了解了 URL encode的过程,我们能看到2个很重要的问题,

第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;

第二:URL encode到底按照那种编码方式对字符编码?

其实这取决于浏览器,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器默认的编码方式;也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式。

所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL Encode,然后再拼接url提交数据,也就是替浏览器做了URL Encode,好处就是网站可以统一get方法提交数据的编码方式。

二进制随着请求头一起发送出去。

5、对于get方法来说,没有请求实体,含有数据的url都在请求头里面。

之所以用URL Encode,我个人觉的原因是:对于请求头来说最终都是要用ISO-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传 送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。

总结:

使用请求方法get时,如果数据串联后的url中只有英文字母或数字,在进行url编码的时候可以直接编码为可以在网络中传输的二进制字节码数据。

但是如果数据串联后的url中还存在有除英文字母以外的文字(如中文,日文等),在进行url编码的时候就需要将这些除英文字母以外的文字进行url编码编码为ASCII码,然后再将这些ASCII码继续编码为可以在网络中传输的二进制字节码数据。

二、服务端(服务器)是如何将数据获取到进行解码的

1、第一步是先把浏览器发送过来的数据用ISO-8859-1编码方式进行解码。

2、对于get方法来说,服务器对数据进行解码之后得到的是ASCII范围内的请求头字符【也就是上述讲解的浏览器在发送数据时对url进行url Encode之后的状态】,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL Encode后的%XY状态。

3、那么到底用什么编码方式解码数据的呢?其实这取决于服务器,默认缺省用的是 ISO-8859-1,这就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据 URL Encode,这里用ISO-8859-1方式URL Decode显然不行。通常还需要在服务器中配置正确的方式解码数据:先使用ISO-8859-1方式对接收到的数据进行二进制解码,此时得到是可能存在“%xy”形式的ASCII码,在对url Decode,解析成正确的除英文字母以外的其他文字。

post提交

一、客户端(浏览器)的form表单用post方法是如何将数据编码后提交给服务器端的?

1、在post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢?

在form表单所在的html文件里如果有一段代码:

<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>

post请求方法时就会用此处(charset字段)指定的编码方式编码。

一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码。其实它还有个作用就是指定form表单的post方法提交数据的 URLencode编码方式。

2、从这里可以看出对于get请求方法来说,浏览器对数据的URL Encode的编码方式取决于浏览器的设置(可以用js做统一指定);而对于post请求方法来说,开发人员可以指定对数据的编码方式。

二、服务端(服务器)是如何将数据获取到进行解码的

如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的【将二进制字节码数据解码为浏览器发送的数据】,但是request.setCharacterEncoding("字符集")可以派上用场。

总结:

 

请求方法get和post的在URL encode编码方面的区别以及乱码问题_数据

 

去期待陌生,去拥抱惊喜。



举报

相关推荐

0 条评论