欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

中文乱码解决方案

程序员文章站 2022-03-03 18:41:01
...

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

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

①对于POST请求:只要在获取请求信息之前(在调用request.getParameter或者是request.getReader等),
调用request.setCharacterEncoding(“UTF-8”)即可.
②.对于GET请求:(前面的方式对于GET无效)
当应用服务器调用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");