JSP中文亂碼問題

 

以前老是碰到JSP頁面亂碼的問題,每次都是如今網上搜,而後胡亂改,改完也不明白緣由。html

此次正好做下總結,中文亂碼就是由於編碼不符,可能出現亂碼有四個地方:java

1 JSP編碼亂碼apache

2 HTML編碼亂碼tomcat

3 request獲取數據亂碼服務器

4 response輸出信息亂碼cookie

5 Cookie致使的編碼問題jsp

下面將會對上面幾種狀況進行介紹:ui

  JSP亂碼

  這種是最多見的,設置編碼的位置位於JSP的第一行,若是在Eclipse中新建一個JSP默認是下面這種:編碼

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

  能夠看到它默認的頁面編碼和傳輸編碼都是ISO-8859-1,這是用於歐洲國家的編碼。url

  能夠經過設置Eclipse中JSP的編碼格式,來修改默認生成的編碼格式。

  若是想要支持中文,可使用UTF-八、GB23十二、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"%>
<% 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

相關文章
相關標籤/搜索