以下為Eclipse默認新建JSP的HTML頁面,極具參考價值。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
====================我確實是分割線====================
其中,只需關注的決定性編碼項有:
①contentType charset=ISO-8859-1"
②pageEncoding="ISO-8859-1"
③meta charset=ISO-8859-1"
所以總的來看,關鍵就是兩個charset與一個pageEnconding
====================我確實是分割線====================
問題的原理如下:
①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就發揮了功效。
====================我確實是分割線====================
中文亂碼解決方案:
1 調用JSP頁面出現亂碼
通過浏覽器調用JSP頁面,在浏覽器中所有的中文內容出現亂碼。
首先確認本JSP在編碼器中保存人家內容時,使用的UTF-8的編碼格式,然後在JSP頁面的開咋始,添加<%@ pageEncoding "utf-8"%> 就可以解決這個中文亂碼問題。
2 調用Servlet頁面出現亂碼
通過浏覽器調用Servlet,Servlet在浏覽器中所有的中文內容出現亂碼
在Servlet使用response對輸出內容之前,先執行response.setContentType("text/html;charset=utf-8")設定輸出的內容的編碼。
3 POST表單傳遞參數亂碼
通過JSP頁面,HTML,頁面或者Servlet中的表單元素提交參數給對應的JSP頁面或者Servlet,而JSP頁面或者Servlet接收的中文參數亂碼。
在接收POST提交的參數之前,使用request.setCharacterEncoding("utf-8")設定接收參數內容的編碼;
更好的解決方法,就是使用過濾器技術。有很多這樣的帖子。
4 URI方式傳遞參數或者GET方式亂碼
修改TAMCAT的server.xml配置文件,
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" >
紅色部分就是添加的URIEncoding="UTF-8",重啟TAMCAT就行了
5 Properties文件亂碼
在使用一些類庫或者框架時(例如:JSTL ,Format標簽庫,Displaytag標簽庫和Struts框架),為了實現頁面內容的國際化,需要編寫對應的properties文件,而propertise文件中的中文內容在顯示的時候也會出現亂碼。
native2ascii -cencoding utf-8 displaytag.properties
displaytag_zh_CN.properties
還可以使用Eclispse的插件-------Properties Editor
還有就是數據庫的設置。
====================我確實是分割線====================
傻瓜式終極解決辦法,人人都懂,絕無錯誤:
所有的設置都設置成utf-8!包括兩個charset與一個pageEnconding以及所有數據庫的設置都是!絕對!我說的!
作者 陳德深