1.Tomcat一般總是默認(rèn)使用ISO-8859-1作為字符編碼方式的,。所以,除非你在Servlet中使用了request.setCharacterEncoding("編碼方式");指定了特殊的編碼方式,,否則Tomcat默認(rèn)使用ISO-8859-1的編碼方式,。
2.在JSP頁面中pageEncoding和charset和含義是不同的。pageEncoding是指頁面的編碼格式(請記??!,十分重要~,,與顯示無關(guān)),,也就是說無論你JSP里的pageEncoding采用什么方式,,如果出現(xiàn)中文亂碼,原因不在于pageEncoding的所指定的編碼方式不對,,而在于charset的屬性不對,。charset是負(fù)責(zé)JSP頁面中的字符按什么編碼方式顯示。pageEncoding只負(fù)責(zé)頁面的編碼格式,,而后JAVA虛擬機(jī)負(fù)責(zé)按照pageEncoding指定的編碼轉(zhuǎn)換成Unicode編碼的字節(jié)碼文件,。(也就是說,無論你pageEncoding指定什么方式,,最終都是轉(zhuǎn)換成了Unicode編碼,。)另外請大家注意,如果從客戶端提交的用戶請求里的中文也是使用pageEncoding方式編碼的,。也就是說,,在Servlet中request.getParameter("參數(shù)");Tomcat默認(rèn)是使用ISO-8859-1方式去讀取的,但實(shí)際里面的字符編碼方式應(yīng)該是JSP頁面pageEncoding所指定的方式,。除非用戶自己加上request.setCharacterEncoding("編碼方式");
3.明白pageEncoding和charset之間的關(guān)系,。一般而言,如果頁面里指定了pageEncoding的方式也就是說,,比如:<%@page language="java" import="java.util.*" pageEncoding="GBK"%>這句話,,而沒有指定charset的話,那么頁面默認(rèn)是按照charset=ISO-8859-1編碼方式顯示字符,,按照pageEncoding="GBK"方式進(jìn)行頁面的編碼,。如果你的JSP頁面里面沒有指定pageEncoding方式,而只是說明了charset的話,,比如:
<%@ pagecontentType="text/html;charset=utf-8"%>這句話,,那么JSP默認(rèn)是按照pageEncoding="utf-8"進(jìn)行頁面編碼的,字符集按照charset=utf-8"顯示,。
4.使用request.setCharacterEncoding("編碼方式");注意:request.setCharacterEncoding()僅僅對POST提交方式起作用,,對于GET方式提交還是會(huì)出現(xiàn)亂碼問題。要解決GET提交中文的亂碼問題,,可以在Server.xml的<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
加入:URIEncoding="utf-8" useBodyEncodingForURI="true"
另外,,request.setCharacterEncoding()這句話一定要放在要讀取的第一參數(shù)之前調(diào)用。否則也不起作用了??!
下來我們看一個(gè)小例子:
在index.jsp頁面中,指定pageEncoding方式:
------------------------------------------------------------------
<%@ page language="java" import="java.util.*"pageEncoding="GBK" %>
<html>
<head>
<basehref="<%=basePath%>">
<title>My JSP 'index.jsp' startingpage</title>
<meta http-equiv="pragma"content="no-cache">
<meta http-equiv="cache-control"content="no-cache">
<meta http-equiv="expires"content="0">
<meta http-equiv="keywords"content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is mypage">
<!--
<link rel="stylesheet" type="text/css"href="styles.css">
-->
</head>
<body>
<form action=servlet/Loginmethod=post>
用戶名:<input type=text name="username"size=20><br>
密碼:<input type="password" name="password"size=20><br>
<input type=submitname="submit">
</form>
</body>
</html>
-------------------------------------------------------------
在Login.java Servlet源文件中:
public void doPost(HttpServletRequest request, HttpServletResponseresponse)
throws ServletException,IOException {
PrintWriter out = response.getWriter();
out.print("<H>welcome you comehere!</H>");
out.print("<br>");
out.println(request.getParameter("username"));
out.print("<br>");
out.println(request.getParameter("password"));
out.print("<br>");
out.flush();
System.out.println(response.getCharacterEncoding());
out.close();
}
當(dāng)輸入中文的用戶名,,調(diào)用Login Servlet后,,結(jié)果能正常顯示中文,讀者看到這里似乎感到很奇怪,。
因?yàn)?,在LoginServlet中并沒有使用request.setCharacterEncoding("編碼方式");指定特點(diǎn)的編碼方式,,也就是說Tomcat默認(rèn)是使用ISO-8859-1的方式,怎么能正常顯示中文了呢,?問題出在IE瀏覽器上,,請大家注意!因?yàn)?,大家默認(rèn)使用的都是中文IE瀏覽器,,所以中文IE瀏覽器默認(rèn)使用的字符集是charset=GBK,再請大家注意了,在上面這段LoginServlet代碼中并沒有指定response.setContentType("text/html;charset=GBK");這樣的語句,,也就是說IE瀏覽器認(rèn)為,既然用戶自己沒有指定字符集,,那么就使用默認(rèn)的字符集,,也就是默認(rèn)使用了charset=GBK,
所以你所看到的中文顯示,,是IE瀏覽器默默幫你轉(zhuǎn)換了,,從ISO-8859-1到GBK的轉(zhuǎn)換,也就是說IE瀏覽器幫你做了這么一句話:
out.println(newString(request.getParameter("username").getBytes("ISO-8859-1"),"gbk"));
再請大家注意,,如果你在Login Servlet原碼中加入了response.setContentType("text/html;charset=GBK");那么你就畫蛇添足了,,反而起到不好的效果,因?yàn)镮E瀏覽器認(rèn)為用戶自己已經(jīng)指定了特定的字符集方式,,而且就是charset=GBK方式,,所以就不需要從ISO-8859-1到GBK的轉(zhuǎn)換,因?yàn)镮E瀏覽認(rèn)為你頁面里的字符就應(yīng)該是GBK編碼方式的,,但是其實(shí)不然,,是ISO-8859-1方式的,所以反而顯示的中文亂碼了,。
下來,,我們把上面的小例子改一下:index.jsp頁面中只指定charset方式:
<%@ pagecontentType="text/html;charset=utf-8"%>
<html>
<head>
<basehref="<%=basePath%>">
<title>My JSP 'index.jsp' startingpage</title>
<meta http-equiv="pragma"content="no-cache">
<meta http-equiv="cache-control"content="no-cache">
<meta http-equiv="expires"content="0">
<meta http-equiv="keywords"content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is mypage">
<!--
<link rel="stylesheet" type="text/css"href="styles.css">
-->
</head>
<body>
<form action=servlet/Loginmethod=post>
用戶名:<input type=text name="username"size=20><br>
密碼:<input type="password" name="password"size=20><br>
<input type=submitname="submit">
</form>
</body>
</html>
-------------------------------------------------------
在Login.java Servlet源文件中:
public void doPost(HttpServletRequest request, HttpServletResponseresponse)
throws ServletException,IOException {
response.setContentType("text/html;charset=utf-8");
//response.setContentType("text/html;charset=GBK");//也可以正常顯示中文
request.setCharacte 補(bǔ)充:Web開發(fā) , Jsp ,
|