之前總是碰到JSP頁面亂碼的問題,每次都是現在網上搜,然後胡亂改,改完也不明白原因。
這次正好作下總結,中文亂碼就是因為編碼不符,可能出現亂碼有四個地方:
1 JSP編碼亂碼
2 HTML編碼亂碼
3 request獲取數據亂碼
4 response輸出信息亂碼
5 cookie導致的編碼問題
下面將會對上面幾種情況進行介紹:
JSP亂碼
這種是最常見的,設置編碼的位置位於JSP的第一行,如果在Eclipse中新建一個JSP默認是下面這種:
<%@ page language="Java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
可以看到它默認的頁面編碼和傳輸編碼都是ISO-8859-1,這是用於歐洲國家的編碼。
可以通過設置Eclipse中JSP的編碼格式,來修改默認生成的編碼格式。
如果想要支持中文,可以使用UTF-8、GB2312、GBK等,其中UTF-8是國際化的,哪個國家的都支持,所以推
薦使用這個。
再來說說上面涉及到編碼的兩個地方:charset 和 pageEncoding
charset是指服務器發往客戶端展現時的編碼;
pageEncoding用於設置JSP頁面本身的編碼。
JSP在部署後提供給用戶使用,會經過三個階段:
1 JSP生成java文件:這個階段會使用pageEncoding所定義的編碼格式進行轉換
2 java文件生成class文件:這個階段由服務器tomcat自動使用utf-8編碼把java文件轉換成字節碼class文件
3 通過讀取class文件展現給用戶:這個階段由tomcat服務器獲取字節碼內容,通過使用contentType所定義的編
碼格式展現給用戶。
大致過程如下圖:
這樣設置好JSP中的第一行代碼,就可以保證基本的JSP展現沒有亂碼了!
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
HTML亂碼
因為JSP中也包含HTML的內容,HTML本身也是有編碼格式的。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>

如果這部分編碼出現問題,那麽HTML中標簽的中文命名就會出現亂碼。
HTML中因為只涉及到表現層,所以只有一個屬性content中charset,這個編碼格式設置對了,就沒問題了。
request中文亂碼
有時候在做jsp邏輯處理時,比如提交表單,從前臺註冊的頁面提交了一部分的數據,但是後面處理的JSP頁面
通過 request.getParameter 調用時,獲取到的是一堆亂碼。
這是因為雖然前面JSP設置了編碼格式,卻沒有在當前的JSP中設置讀取數據的編碼格式。
使用下面的代碼,就可以是設置request獲取請求內容的數據編碼:
request.setCharacterEncoding("UTF-8");
需要註意的是,這種方式對 URL傳參這種JSP請求 是沒有作用的。比如:
<a href="jspRequest.jsp?username=lisi">url test request(en)</a> <a href="jspRequest.jsp?username=李四">url test request(zh)</a>
這種情況仍然會出現亂碼,這種URL傳參的方式,只能修改服務器tomcat的傳輸編碼格式。
修改tomcat安裝文件 apache-tomcat-6.0.43\conf 目錄下的server.xml
添加 URIEncoding="UTF-8" ,就可以處理URL傳遞參數造成的中文亂碼問題了。
response輸出中文亂碼
可能現在已經沒有多少使用這種方式輸出頁面的了,但是還是有必要說一下,response輸出頁面元素內容時,也
會出現亂碼。
使用下面代碼就可以設置response輸出的編碼格式:
response.setContentType("text/html;charset=UTF-8");
cookie造成的中文亂碼
Cookie由於需要保存在客戶端中,因此使用過程中都需要編碼以及轉碼:
在保存Cookie數據前
首先引入java.net.*,該包中包含URLEncoder類;
保證response與request的編碼正確;
使用URLEncoder進行轉碼,並保存。

<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.net.*" pageEncoding="UTF-8"%> <% //保證request以及response的編碼 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //使用URLEncoder解決cookie中中文問題 String username = URLEncoder.encode(request.getParameter("username"),"UTF-8"); String password = URLEncoder.encode(request.getParameter("password"),"UTF-8"); Cookie usernameCookie = new Cookie("username",username); Cookie passwordCookie = new Cookie("password",password); usernameCookie.setMaxAge(864000); passwordCookie.setMaxAge(864000); response.addCookie(usernameCookie); response.addCookie(passwordCookie); %>

在使用Cookie數據前
依然要註意導入必備的包:java.net.*
註意request的編碼;
使用URLDecoder進行解碼

<%@ page language="java" import="java.util.*,java.io.*,java.net.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <% request.setCharacterEncoding("UTF-8"); String username = ""; String password = ""; Cookie[] cookies = request.getCookies(); if(cookies!=null && cookies.length>0){ for(Cookie c:cookies){ if(c.getName().equals("username")){ username = URLDecoder.decode(c.getValue(),"UTF-8"); system.out.println(username); } if(c.getName().equals("password")){ password = URLDecoder.decode(c.getValue(),"UTF-8"); } } } %>

參考
【1】JSP中pageEncoding與ContentType的區別:http://blog.csdn.net/dragon4s/article/details/6604624
Tags: request Cookie 服務器 客戶端 中文
文章來源: