黑马程序员技术交流社区

标题: 史上最全Servlet,JSP乱码问题,妈妈再也不用担我的乱码问了 [打印本页]

作者: xiaochongbojue    时间: 2014-10-22 10:04
标题: 史上最全Servlet,JSP乱码问题,妈妈再也不用担我的乱码问了
一、常识了解

1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;

2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码;

3.getBytes() 是通过平台默认字符集进行编码;


二、中文乱码出现

在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置;而在Servlet中,也会遇到中文乱码问题;

比如:

OutputStream out = response.getOutputStream();

out.write(String );

输出中文时可能会出现乱码;

比如:

[java] view plaincopy




输出乱码的问题是程序用UTF-8编码,而浏览器用GB2312解码,因此会出现乱码;


Servlet乱码分为request乱码和response乱码;



三、response中文乱码

在网上很有效的解决方法是添加:

response.setCharacterEncoding("UTF-8");

解决不了,后来又搜到一条解决方法是:

respnse.setHeader("content-type","text/html;charset=UTF-8");

两句都填上,后来终于解决了这个问题;

其实我们应该思考一下本质;


问题1:

我们这里先来说明一下错误的原因,下图是显示乱码的流程图:

[attach]56237[/attach]

response.setContentType("text/html;charset=UTF-8"); 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码;

response.setCharacterEncoding("UTF-8"); 的目的是用于response.getWriter()输出的字符流的乱码问题,如果是response.getOutputStream()是不需要此种解决方案的;因为这句话的意思是为了将response对象中的数据以UTF-8解码后发向浏览器;

解决方案流程图:

file:///E:/NoteOfStudt/temp/a8ba797c-22d7-4ae1-acc4-42d6327fe8a1_128_files/57aa4bee-94aa-41b8-aa27-f51ddfde789a.gif

[attach]56239[/attach]

问题2问题代码如下:[java] view plaincopy




浏览器输出: ??

原因:"博客"首先被封装在response对象中,因为IE和WEB服务器之间不能传输文本,然后就通过ISO-8859-1进行编码,但是ISO-8859-1中没有“博客”的编码,因此输出“??”表示没有编码;


错误代码流程图:

file:///E:/NoteOfStudt/temp/a8ba797c-22d7-4ae1-acc4-42d6327fe8a1_128_files/de5e5559-0c55-40b0-a89a-dc7bc93314d0.gif

[attach]56240[/attach]


而解决方案是:response.setCharacterEncoding("GB2312"); 设置response使用的码表


解决方案流程图:

[attach]56241[/attach]

补充:通过<meta>标签模拟response头;

<meta http-equiv="content-type" content="text/html"/> 等价于 response.setContentType("text/html");

四、request乱码问题

request请求分为post和get,对于不同的请求方式有不同的解决乱码的方案;


1.post请求乱码

错误原因:

[attach]56242[/attach]


解决方案:

[attach]56243[/attach]

2.get请求乱码

[attach]56244[/attach]




作者: xiaochongbojue    时间: 2014-10-22 10:07
图片:
作者: Chopper    时间: 2014-10-22 12:33
好帖,收藏
作者: xiaochongbojue    时间: 2014-10-22 15:29
Chopper 发表于 2014-10-22 12:33
好帖,收藏

谢谢,还以为大家都认为我是菜鸟呢
作者: yueyazhishang    时间: 2014-10-22 17:11
图画的不错。
作者: xiaochongbojue    时间: 2014-10-22 19:37
王老师真给力,开心啊,继续努力!!{:2_42:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2