问题描述

post请求如果请求参数有中文,不进行任何处理,在代码中从request中获取的参数是有乱码的。

  1. 页面
    【JavaEE】post请求中文乱码原理(记录)

  2. 请求参数
    请求头参数类型是:Content-Type: application/x-www-form-urlencoded
    原参数值是:
    【JavaEE】post请求中文乱码原理(记录)
    经过url编码的参数值是:
    【JavaEE】post请求中文乱码原理(记录)
    真正发送给服务器是url编码后的值,也就是:%E5%BC%A0%E4%B8%89

  3. 服务器端
    在服务器端,从request中获取test参数已经是乱码。
    【JavaEE】post请求中文乱码原理(记录)


    也就是在浏览器端发送的数据是【%E5%BC%A0%E4%B8%89】,但到服务器端获取到的是【å¼ ä¸】


原理

  1. 对数据进行url编码还需要一个参数,编码方式,比如:UTF-8,ISO8859-1。这里不清楚url编码的原理,但是不管是编码还是解码,都需要一种编码方式。
  2. 浏览器对中文进行url编码时,用的是UTF-8编码方式。但服务器端接收到已编码的字符串进行url解码时,用的是服务器端默认的编码方式ISO8859-1。前后编码方式不一致,因此出现乱码。
  3. 可用以下代码还原。
    【JavaEE】post请求中文乱码原理(记录)
  4. 把url解码时的默认编码方式ISO8859-1改为和浏览器的编码方式一样的UTF-8就可以解决问题。【JavaEE】post请求中文乱码原理(记录)
  5. 在源码中的表现为:从request中解析参数的时候,这行代码获取到的服务器的编码方式为空。这样下面的代码就会使用默认的编码方式进行解码。【JavaEE】post请求中文乱码原理(记录)



解决方式

  1. 在从request中获取参数前,先通过request.setCharacterEncoding(“UTF-8”);设置服务器端编码方式。
    【JavaEE】post请求中文乱码原理(记录)

  2. Spring框架中已经给出了解决方案,使用CharacterEncodingFilter过滤器。只需要在web.xml中进行配置。【JavaEE】post请求中文乱码原理(记录)

  3. CharacterEncodingFilter过滤器的源码中也是这样处理的。
    【JavaEE】post请求中文乱码原理(记录)

  4. 在源码中的表现为:从request中解析参数的时候,这行代码获取到的服务器的编码方式为设置的UTF-8。这样下面的代码就会使用UTF-8的编码方式进行解码。【JavaEE】post请求中文乱码原理(记录)




为了记录编码问题,一直没太弄懂。要记得用什么编码方式编码,就要用什么编码方式解码,必须是配套的,否则就会出现乱码。

相关文章: