標籤:c style class blog java a
解決的需要三個地方
1、jsp頭有三處和編碼合適有關
2、更改tomcat的server
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="GBK" />
增加紅色部分
3、如果此時還是亂碼
對於get請求 則添加request.setCharacterEncoding("編碼格式例如GBK");
下面內容轉自他人成果http://blog.csdn.net/xiazdong/article/details/7217022
一、常識瞭解
1.GBK包含GB2312,即如果通過GB2312編碼後可以通過GBK解碼,反之可能不成立;
2.java.nio.charset.Charset.defaultCharset() 獲得平台預設字元編碼;
3.getBytes() 是通過平台預設字元集進行編碼;
二、中文亂碼出現
在學習任何一門技術時,經常會有初學者遇到中文亂碼問題,比如MySQL,是因為在安裝時沒有設定;而在Servlet中,也會遇到中文亂碼問題;
比如:
OutputStream out = response.getOutputStream();
out.write(String );
輸出中文時可能會出現亂碼;
比如:
[java] view plaincopy
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
- OutputStream out = response.getOutputStream();
- String data = "部落格";
- out.write(data.getBytes("UTF-8"));
- }
輸出亂碼的問題是程式用UTF-8編碼,而瀏覽器用GB2312解碼,因此會出現亂碼;
Servlet亂碼分為request亂碼和response亂碼;
三、response中文亂碼
在網上很有效解決方案是添加:
response.setCharacterEncoding("UTF-8");
解決不了,後來又搜到一條解決方案是:
respnse.setHeader("content-type","text/html;charset=UTF-8");
兩句都填上,後來終於解決了這個問題;
其實我們應該思考一下本質;
問題1:
我們這裡先來說明一下錯誤的原因,是顯示亂碼的流程圖:
response.setContentType("text/html;charset=UTF-8"); 目的是為了控制瀏覽器的行為,即控制瀏覽器用UTF-8進行解碼;
response.setCharacterEncoding("UTF-8"); 的目的是用於response.getWriter()輸出的字元流的亂碼問題,如果是response.getOutputStream()是不需要此種解決方案的;因為這句話的意思是為了將response對象中的資料以UTF-8解碼後發向瀏覽器;
解決方案流程圖:
問題2問題代碼如下:
[java] view plaincopy
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- PrintWriter out = response.getWriter();
- String data = "部落格";
- out.println(data);
- }
瀏覽器輸出: ??
原因:"部落格"首先被封裝在response對象中,因為IE和WEB伺服器之間不能傳輸文本,然後就通過ISO-8859-1進行編碼,但是ISO-8859-1中沒有“部落格”的編碼,因此輸出“??”表示沒有編碼;
錯誤碼流程圖:
而解決方案是:response.setCharacterEncoding("GB2312"); 設定response使用的碼錶
解決方案流程圖:
補充:通過<meta>標籤類比response頭;
<meta http-equiv="content-type" content="text/html"/> 等價於 response.setContentType("text/html");
四、request亂碼問題
request請求分為post和get,對於不同的請求方式有不同的解決亂碼的方案;
1.post請求亂碼
錯誤原因:
解決方案:
2.get請求亂碼
第二篇內容:http://blog.csdn.net/haojiahj/article/details/17060069
pageEncoding與charset區別
pageEncoding是設定的JSP頁面原始碼的字元編碼格式,如果該項的值是utf-8,則JSP原始碼裡不能寫漢字了,如果你用的是eclipse等工具的話,儲存時他會提示有一個錯誤,改成gbk就沒事了,就是這個道理
charset是請求伺服器以後返回過來的內容的字元編碼(當瀏覽器得到此檔案時以什麼方式解碼),即使pageEncoding設定了gbk,儲存,運行程式,查看頁面時會發現剛才寫的漢字不能正常顯示,把charset改成gbk,正常。
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page contentType="text/html;charset=ISO-8859-1"%>
<html>
<head>
<title>你好</title>
</head>
<body>
你好 <br>
</body>
</html>
會產生亂碼,因為存為UTF-8的檔案被解碼為iso8859-1,這樣 如有中文肯定出亂碼。
Charset可以修改為GBK
response和request的setCharacterEncoding 區別
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding():是設定從request中取得的值或從資料庫中取出的值。
指定後可以通過getParameter()則直接獲得正確的字串,如果不指定,則預設使用iso8859-1編碼。值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應該是在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容,而後續的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對於GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析提交內容,setCharacterEncoding()自然就無效。
get需在Tomcat的server.xml中的:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
URIEncoding="GBK" />
)加入URIEncoding="GBK",解決get請求亂碼問題response.setContentType("text/html;charset=gb2312"):是設定頁面中為中文編碼。即以哪種編碼返回給用戶端。
前者是設定動態文字(參數,資料庫),後者設定頁面靜態文字
response.setContentType指定 返回給用戶端的編碼,同時指定了瀏覽器顯示的編碼.
response.setCharacterEncoding設定HTTP 響應的編碼,如果之前使用response.setContentType設定了編碼格式,則使用response.setCharacterEncoding指定的編碼格式覆蓋之前的設定.與response.setContentType相同的是,調用此方法,必須在getWriter執行之前或者response被提交之前.