关于中文乱码的问题,首先需要了解一下什么字符集编码
参考文献:字符集编码

服务端获取浏览器数据乱码:

①对于POST请求:只要在获取请求信息之前(在调用request.getParameter或者是request.getReader等),调用request.setCharacterEncoding(“UTF-8”)即可.
②.对于GET请求:(前面的方式对于GET无效)

  • 方案一:修改Tomcat的server.xml;在8080端口处加上URIEncoding=“UTF-8”
  • DES中文解码后乱码 中文乱码怎么解决_应用服务器

  • 方案二:
    当应用服务器调用getParameter方法获得字符串时,getParameter方法会去向应用服务器请求参数。应用服务器最初获得的就是发送来的以浏览器编码格式编的码,即字节数组。应用服务器会对这个数据进行URLdecode解码操作(服务器通常使用ISO-8859字符集),再把解码后的字符串响应给getParameter。
    假如浏览器端使用UTF-8字符编码。编码的字节数组到了应用服务器,应用服务器再用ISO-8859进行解码,就会出现乱码。因此可以在服务端,把乱码的字符串。通过ISO-8859编码得到从浏览器到服务器传输过程中的字节数组(即浏览器给服务器发送的原始字节数组),再用UTF-8解码得到正确的字符。
    因此对于doGet()请求的中文乱码解决方案:
//获取请求参数
Stringusername=req.getParameter("username");
//1先以iso8859-1进行编码
//2再以utf-8进行解码
username=newString(username.getBytes("iso-8859-1"),"UTF-8");

③也可以在客户端先两次编码,在服务端2次解码(应用服务器解一次,人为解一次)
假设页面端输入的中文是一个“中”,按照下面步骤进行解码

  1. 在前端,第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]此时已经没有了多字节字符,全部是单字节字符。
  2. 在前端第二次encodeURI,进行编码,会把%看成一个转义字符,并不编码%以后字符,会把%编码成%25.把数组最后变成[%25E4,%25B8,%25AD]然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端,
  3. 当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
    应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,应用服务器进行解码的这一次,不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[%E4,%B8,%AD],因为都会把%25解析成%.并把这个值返回给getParameter方法(本次相当于在服务端进行一次解码了)
  4. 再用UTF-8解码一次,就得到"中"了。(在服务端进行第二次解码)
    想想看,如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码。

对于响应的乱码解决,即后端发送给前端数据的乱码解决方案:

  • 方法一:
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html;charset=UTF-8");
  • 方法二(推荐):
//它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
//此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html;charset=UTF-8");