Servlet 传输中文乱码原理及解决方法

乱码原理:

在整个Servlet访问过程中牵扯到 浏览器,Tomcat,Java程序三者

浏览器默认编码方式:gbk,

Tomcat默认编码:iso-8859-1 ,

java代码中的编码一般常用utf-8


从Servlet传输数据到浏览器的过程是:Servlet  --->  Tomcat  --->  浏览器 , 但是这两个传输过程的方式又不相同,


解决Servlet 向浏览器传输中文乱码(响应乱码):

只需要把 Tomcat 和浏览器的编码都改成 utf-8 

在Servlet中 response.setCharacterEncoding("utf-8");这个方法只能改变 Tomcat 的编码方式,所以不行

可以使用另一种方法:响应乱码解决方法:

response.setContentType("text/html;charset=utf-8");

以上方法就可以同时把 Tomcat 和浏览器的编码全部该掉,也就解决了响应乱码问题


以上是解决 后台向前台传输中文乱码 , 下面再讲解 浏览器向后台传输中文乱码问题

--------------------------前台向后台传输中文乱码(请求乱码)------------------------------

其实, 浏览器向Servlet 传输出现乱码的原理是和上面是一样的,都是因为  java代码 , Tomcat , 浏览器三者的编码方式不同,但是,前台向后台传输的解决办法比较麻烦,因为 GET 和 POST 两种提交方式不同 , 传输数据的方式也不同,先讲解一下两种方式的本质不同点:

POST: 大家都知道 post 请求,在请求路径后面的 ?和键值是没有的, 是因为post传输是另外专门开启了一个数据传输通道,其实是一个字节传输流 , 在Servlet 中 通过request.getInputStream(); 就可以获得这个字节流, 这条流也是依赖于Tomcat的所以它的编码也是 iso-8859-1 (这点我是猜的), 所以当这条字节流接收到 '中' 时,它会根据它自己的编码方式来获取 '中' 的编码 , 这时由于流本身的编码是不支持中文的,所以还是会把 '中' 当成 '?'来获取编码 还是 63 , 然后把 63 通过流传输到 java代码中 , 但是 java代码 看到的就是 63, 已经不是 '中' 的正确编码,所以出现乱码


POST 乱码解决方法:

request.setCharacterEncoding("utf-8");

只需要把这条传输流的编码改成utf-8 , 这句可以把Tomcat和字节流的编码都改成 utf-8

这时,字节流在获取浏览器传来的数据时就 不会出错,传输到后台字节也不会错,后台解析也就不会错了


GET:大家都知道 get 方式是把传输的数据以 键=值 的方式加在请求路径的后面 (www.baidu.com?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu)

get 方式本身传输还是通过 浏览器 --->  Tomcat  ---> java代码  这样的过程,也就是后台向前台传输的逆过程, 但是,由于浏览器的编码我们改不了,所有从浏览器到 Tomcat 这个过程字符已经出错 , 但是由于这个过程传输的是字节, 所以字节没有错,我们可以通过字节把字符逆转回来.

解决方式 :

请求传输过程解析:


GET 方式的乱码解决:原理在上图中有解释

String username = request.getParameter("username");

username = new String(username.getBytes("iso-8859-1"),"utf-8");




到这里乱码的原理和解决方式都讲完了,等以后学习更深入了再进行修改



已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页