解决Servlet中文乱码问题
一、出现乱码的原因 由于浏览器默认使用UTF-8码表进行编码,而servlet使用ISO-8859-1码表进行编码,传输和接收方编码不一致导致乱码的产生。中文乱码就是因为编码不符,可能出现乱码有四个地方:1 JSP编码乱码2 HTML编码乱码3 request获取数据乱码4 response输出信息乱码二、乱码的类型以及解决办法1、Html中文乱码问题。...
一、出现乱码的原因
由于浏览器默认使用UTF-8码表进行编码,而servlet使用ISO-8859-1码表进行编码,传输和接收方编码不一致导致乱码的产生。中文乱码就是因为编码不符,可能出现乱码有四个地方:
1 JSP编码乱码
2 HTML编码乱码
3 request获取数据乱码
4 response输出信息乱码
二、乱码的类型以及解决办法
1、Html中文乱码问题。
1> 检查前台页面上的charset的字符集是否是utf-8
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
2> 然后再查看后台项目的编码集是否是一致的
右击项目-->选择Properties-->然后查看一下Text file encoding 下的编码格式是否为utf-8,如果不是就把他改为utf-8即可
2.1http请求乱码问题—— request乱码
request请求分为post和get,分别有不同的方法解决
1>post请求出现乱码:(虽然前面JSP设置了编码格式,却没有在当前的JSP中设置读取数据的编码格式。)
解决方法:在servlet页面添加(方法第一行)
request.setCharacterEncoding("UTF-8");
2>get请求出现乱码:
解决方法:在后台获取字符串后对编码进行转化,如常见的编码ISO-8859-1,代码如下
String name = request.getParameter("name");
name=new String(name.getBytes("ISO-8859-1","utf-8"))
2.2http请求乱码问题—— response乱码
1>post请求出现乱码:
解决方法:在servlet页面添加
response.setCharcacterEncoding("utf-8")
3、修改数据库连接,使用以下方式指定编码:
jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf8
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK" %> pageEncoding="GBK"告诉JVM 这个jsp本身采用的"GBK"编码, JVM默认iso-8859. contentType里的charset=utf-8是指示页面的输出方式为utf-8 pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容编码
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示输出中文乱码的问题
public class ServletResponse1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//采用字节流输出数据
String s = "测试中文乱码" ;
//response.getOutputStream().write(s.getBytes()) ; //不会出现乱码
//response.getOutputStream().write(s.getBytes("utf-8")) ;
//解决乱码问题
//第一种办法:让用户在浏览器中选择解码(不靠谱)
//第二种方式:通知浏览器采用某种编码进行解码
//response.setHeader("Content-Type", "text/html;charset=UTF-8") ;
//第三种方式:输出一个字符串
// response.getOutputStream().write("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>".getBytes()) ;
// response.getOutputStream().write(s.getBytes("utf-8")) ;
//第四种方式 让服务器的编码用一种编码,通知浏览器的解码
// response.setCharacterEncoding("UTF-8") ;
// response.setHeader("Content-Type", "text/html;charset=UTF-8") ;
//
// response.getOutputStream().write(s.getBytes("utf-8")) ;
//第五种方法(推荐)
response.setContentType("text/html;charset=utf-8") ; //此句代码做了两件事情:1 设定服务器将数据编码时用的码表
// 2.通知浏览器解码用的码表
//
// response.getOutputStream().write(s.getBytes("UTF-8")) ;
//字符流输出中文
response.getWriter().write(s) ;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
更多推荐
所有评论(0)