1.post请求为什么不会乱码?
jsp页面有pageEncoding="UTF-8",进行编码设置,服务端web.xml中有过滤器
org.springframework.web.filter.CharacterEncodingFilter进行request.setCharacterEncoding("utf-8")操作,
故在服务端获取的参数不会乱码。
2.get请求为什么会乱码?
get请求参数是通过URL传递的,浏览器默认的会对中文进行gbk编码(URL中如果含有中文等非ASCII字符,则浏览器会对它们进行URLEncode),
而且tomcat默认会对url进行ISO-8859-1编码(可通过修改server.xml设置
修改tomcat的配置文件server.xml:
<Connector URIEncoding="UTF-8"
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
connectionTimeout="20000" disableUploadTimeout="true" />),
request.setCharacterEncoding("utf-8")设置的编码格式对url参数是不起作用的,
pageEncoding="UTF-8"对url传递也是不起作用的,wel.xml中的org.springframework.web.filter.CharacterEncodingFilter
过滤器实际则是request.setCharacterEncoding("utf-8")操作,也不起作用,故在服务端获取参数会出现乱码。
服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)
可通过先获取参数的ISO-8859-1字节,在根据gbk解码可获取参数,即:
String param = new String(urlParam.getBytes("ISO-8859-1"),"gbk"),(urlParam则是url传递的参数)
3.日常的工作中我们经常使用两次调用encodeURI来解决乱码问题,这是为什么?
encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码,
UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.
假设页面端输入的中文是一个“中”,按照下面步骤进行解码,
第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],
对字节码数组进行遍历,把每个字节转化成对应的16进制数,
这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD] 此时已经没有了多字节字符,全部是单字节字符。
第二次encodeURI,进行编码,会把%看成一个转义字符,
并不编码%以后字符,会把%编码成%25.把数组最后变成[%25E4,%25B8,%25AD]
然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端
当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],
应用服务器会对这个数据进行URLdecode(服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)操作,应用服务器进行解码的这一次,
不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[%E4,%B8,%AD],
因为都会把%25解析成%.并把这个值返回给getParameter方法,
再用UTF-8解码一次,就得到"中"了。
(如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码)。
4.为什么request.setCharacterEncoding("utf-8"),只会对post方式有作用?
下回分解
5.工作中应该如何更好的避免get请求中文乱码?
下回分解
相关推荐
可以解决post get请求乱码问题.
参看文档:http://blog.csdn.net/sinat_29398599/article/details/52880036
get post 请求中文乱码 处理方式一(小实例+说明文档)
get请求乱码问题 java
使用过滤器实现GET请求和POST请求的中文乱码问题,只需在自己的Web应用中的web.xml中配置该filter即可使用。
超文本传输协议(HTTP)的...两种 HTTP 请求方法:GET 和 POST 在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。 GET - 从指定的资源请求数据。 POST - 向指定的资源提交要被处理的数据
过滤器实现get请求乱码问题 过滤器实现get请求乱码问题 过滤器实现get请求乱码问题
POST 和 GET 是 HTTP 请求方法,用于在客户端和服务器之间传递数据和请求资源。它们之间的主要区别在于数据传输和请求的方式,以及用途。 GET 适用于获取数据,对数据的可见性和安全性要求较低,而 POST 适用于提交...
最近在工作中,由于合作商只提供uRL,我这边需要通过HTTP请求Get或Post方式请求Json数据,然后解析JSON格式,解析json我使用的第三方库rapidjson。开发环境是64位win7,VS2015。
VC++ HTTP Get Post请求
C# http Get/POST请求封装类
GET请求和POST请求详解.docx
https://blog.csdn.net/myWorld001/article/details/109261850
用HTML页面模拟测试get/post请求,psot请求参数的格式为json串
java调用HTTP接口(Get请求和Post请求)
GET 和 POST 是我们最常用的两种请求方式,今天讲一讲如何在 golang 服务中,正确接收这两种请求的参数信息。 处理GET请求 1.1 接收GET请求 //接收GET请求 func Get(writer http.ResponseWriter , request *...
能处理所有servlet里的乱码,让你的网页里不在有乱码
C++实现HTTP的GET,POST请求及HTTPS的请求
50行代码http发送Post/Get请求,直接在linux gcc编译即可使用,或在win下任意c/c++编译器都可