写了一个程序,读取一个html文件 然后输出到浏览器 , 发现输出后浏览器的中文显示为乱码。
修改前主要代码如下:
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
// TODO Auto-generated method stub
FileInputStream in = new FileInputStream("D:\\Workspaces_MyEclipse\\SimpleDemo\\WebRoot\\NewFile.html");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
//BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));
res.setContentType("text/html");
//String encoding = res.getCharacterEncoding();
//res.setCharacterEncoding("utf-8");
PrintWriter out = res.getWriter();
while(true){
String line = br.readLine();
if(line == null){
break;
}
out.println(line);
}
}
之所以造成乱码是因为中文编码不同导致的 ,所以我们只要保证从读取到输出 编码一致即可。
这个过程包括 : 新建html文件、读取html、输出到浏览器、浏览器显示
分别检查这几个步骤的编码,
1.查看html文件,编码为“utf-8"
2.读取html文件,代码如下
FileInputStream in = new FileInputStream("D:\\Workspaces_MyEclipse\\SimpleDemo\\WebRoot\\NewFile.html");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
由于是在中文系统下开发,操作系统默认的字符集编码为GBK,所以是以GBK编码来读取utf-8编码的文件的 ,这样就造成了读取进来的数据已经是乱码了,后续自然是乱码。
3.输出到浏览器,代码如下
PrintWriter out = res.getWriter();
由out负责输出,out的编码来自res,即ServletResponse ,通过放开本行注释代码
//String encoding = res.getCharacterEncoding(); 我们发现encoding的值是 ISO-8859-1 ,此处也造成了编码的不同。
4.查看浏览器显示时的编码发现也是utf-8 (浏览器显示编码用户可调默认为utf-8)
经过以上分析我们发现问题出在第2步读取文件时 和 第3步 向浏览器输出时编码不同造成了显示成乱码,
解决方案:将第二步读取文件时的编码设置成utf-8 ,即将
BufferedReader br = new BufferedReader(new InputStreamReader(in)); 替换成 //BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));
再将第3步的res的编码设置成utf-8 就保证了整个流程都统一使用utf-8编码。代码如下
//res.setCharacterEncoding("utf-8");
乱码成功解决掉了。将上面的代码注释都放开 就是正确处理编码的正确代码了。
其他乱码问题处理思路都类似,我们举一反三即可。