解决Servlet中文乱码问题

一、出现乱码的原因

  由于浏览器默认使用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");

  解决Servlet中文乱码问题_第1张图片

  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 = "黑马训练营1" ;
		//response.getOutputStream().write(s.getBytes()) ;  //不会出现乱码
		//response.getOutputStream().write(s.getBytes("utf-8")) ;
		
		//解决乱码问题
		//第一种办法:让用户在浏览器中选择解码(不靠谱)
		//第二种方式:通知浏览器采用某种编码进行解码
		//response.setHeader("Content-Type", "text/html;charset=UTF-8") ;
		//第三种方式:输出一个字符串
//		response.getOutputStream().write("".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);
	}

}



 
 

你可能感兴趣的:(jsp)