问题描述
post请求如果请求参数有中文,不进行任何处理,在代码中从request中获取的参数是有乱码的。
-
页面
-
请求参数
请求头参数类型是:Content-Type: application/x-www-form-urlencoded
原参数值是:
经过url编码的参数值是:
真正发送给服务器是url编码后的值,也就是:%E5%BC%A0%E4%B8%89 -
服务器端
在服务器端,从request中获取test参数已经是乱码。
也就是在浏览器端发送的数据是【%E5%BC%A0%E4%B8%89】,但到服务器端获取到的是【å¼ ä¸】
原理
- 对数据进行url编码还需要一个参数,编码方式,比如:UTF-8,ISO8859-1。这里不清楚url编码的原理,但是不管是编码还是解码,都需要一种编码方式。
- 浏览器对中文进行url编码时,用的是UTF-8编码方式。但服务器端接收到已编码的字符串进行url解码时,用的是服务器端默认的编码方式ISO8859-1。前后编码方式不一致,因此出现乱码。
- 可用以下代码还原。
- 把url解码时的默认编码方式ISO8859-1改为和浏览器的编码方式一样的UTF-8就可以解决问题。
- 在源码中的表现为:从request中解析参数的时候,这行代码获取到的服务器的编码方式为空。这样下面的代码就会使用默认的编码方式进行解码。
解决方式
-
在从request中获取参数前,先通过request.setCharacterEncoding(“UTF-8”);设置服务器端编码方式。
-
Spring框架中已经给出了解决方案,使用CharacterEncodingFilter过滤器。只需要在web.xml中进行配置。
-
CharacterEncodingFilter过滤器的源码中也是这样处理的。
-
在源码中的表现为:从request中解析参数的时候,这行代码获取到的服务器的编码方式为设置的UTF-8。这样下面的代码就会使用UTF-8的编码方式进行解码。
为了记录编码问题,一直没太弄懂。要记得用什么编码方式编码,就要用什么编码方式解码,必须是配套的,否则就会出现乱码。