Servlet解决乱码

request.setCharacterEncoding("UTF-8");
String username=request.getParameter("username");
response.setCharacterEncoding("gb2312");
response.setContentType("text/htm;charset=gb2312");
response.getWriter().write(username);

后台向前台传输中文乱码:

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

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

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

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

浏览器向后台传输中文乱码问题:

因为 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 这个过程字符已经出错 , 但是由于这个过程传输的是字节, 所以字节没有错,我们可以通过字节把字符逆转回来.

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

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

猜你喜欢

转载自www.cnblogs.com/zdcsmart/p/11910341.html