1,最基本的亂碼問題,。
這個亂碼問題是最簡單的亂碼問題。一般新會出現(xiàn),。就是頁面編碼不一致導致的亂碼。
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>中文問題</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
</head>
<body>
我是個好人
</body>
</html>
三個地方的編碼,。
第一個地方的編碼格式為jsp文件的存儲格式,。Ecljpse會根據(jù)這個編碼格式保存文件,。并編譯jsp文件,包括里面的漢字,。
第 二處編碼為解碼格式,。因為存為UTF-8的文件被解碼為iso8859-1,這樣 如有中文肯定出亂碼,。也就是必須一致,。而第二處所在的這一行,,可以沒有,。缺省也是使用iso8859-1的編碼格式,。所以如果沒有這一行的話,“我是個好 人”也會出現(xiàn)亂碼,。必須一致才可以,。
第三處編碼為控制瀏覽器的解碼方式。如果前面的解碼都一致并且無誤的話,,這個編碼格式?jīng)]有關系,。有的網(wǎng)頁出現(xiàn)亂碼,就是因為瀏覽器不能確定使用哪種編碼格式,。因為頁面有時候會嵌入頁面,,導致瀏覽器混淆了編碼格式,。出現(xiàn)了亂碼。
2,, 表單使用Post方式提交后接收到的亂碼問題
這 個問題也是一個常見的問題,。這個亂碼也是tomcat的內(nèi)部編碼格式iso8859-1在搗亂,也就是說post提交時,,如果沒有設置提交的編碼格式,,則 會以iso8859-1方式進行提交,接受的jsp卻以utf-8的方式接受,。導致亂碼,。既然這樣的原因,下面有幾種解決方式,,并比較,。
A, 接受參數(shù)時進行編碼轉(zhuǎn)換
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ,; 這樣的話,,每一個參數(shù)都必須這樣進行轉(zhuǎn)碼。很麻煩,。但確實可以拿到漢字,。
B, 在請求頁面上開始處,,執(zhí)行請求的編碼代碼,, request.setCharacterEncoding("UTF-8"),把提交內(nèi)容的字符集設為UTF-8,。這樣的話,,接受此參數(shù)的頁面就不必在轉(zhuǎn)碼了。直接使用
String str = request.getParameter("something"),;即可得到漢字參數(shù),。但每頁都需要執(zhí)行這句話。這個方法也就對post提交的有效 果,,對于get提交和上傳文件時的enctype="multipart/form-data"是無效的,。稍后下面單獨對這個兩個的亂碼情況再進行說明。
C,, 為了避免每頁都要寫request.setCharacterEncoding("UTF-8"),,建議使用過濾器對所有jsp
進行編碼處理。這個網(wǎng)上有很多例子,。請大家自己查閱,。
/***********************************************************過濾器的使用*******************************************************/
現(xiàn)在將常見的亂碼問題分為JSP頁面顯示中文亂碼、表單提交亂碼兩類。
1)JSP頁面中顯示中文亂碼
在JSP文件中使用page命令指定響應結(jié)果的MIME類型,,如<%@ page language="java" contentType="text/html;charset=gb2312" %>
2)表單提交亂碼
表單提交時(post和Get方法),,使用request.getParameter方法得到亂碼,這是因為tomcat處理提交的參數(shù)時默認的是iso-8859-1,,表單提交get和post處理亂碼問題不同,,下面分別說明。
(1)POST處理
對post提交的表單通過編寫一個過濾器的方法來解決,,過濾器在用戶提交的數(shù)據(jù)被處理之前被調(diào)用,,可以在這里改變參數(shù)的編碼方式,過濾器的代碼如下:
Java代碼
CharacterEncodingFilter.java:
public class CharacterEncodingFilter implements Filter
{
protected String encoding = null;
public void init(FilterConfig filterConfig) throws ServletException
{
this.encoding = filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
}
}
web.xml:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>net.vschool.web.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2) Get方法的處理
tomcat對post和get的處理方法不一樣,,所以過濾器不能解決get的亂碼問題,,它需要在其他地方設置。
打開<tomcat_home>\conf目錄下server.xml文件,,找到對8080端口進行服務的Connector組件的設置部分,,給這個組件添加一個屬性:URIEncoding="GBK"。修改后的Connector設置為:
Java代碼
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" <SPAN style="COLOR: #ff0000">URIEncoding="GBK"</SPAN> />
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
* 注意修改后重新啟動tomcat才能起作用,。
/***********************************************************過濾器的使用*******************************************************/
3,,表單get提交方式的亂碼處理方式。
如果使用get方式提交中文,,接受參數(shù)的頁面也會出現(xiàn)亂碼,,這個亂碼的原因也是tomcat的內(nèi)部編碼格式iso8859-1導致。Tomcat會以get的缺省編碼方式iso8859-1對漢字進行編碼,,編碼后追加到url,,導致接受頁面得到的參數(shù)為亂碼/、,。
解決辦法:
A,, 使用上例中的第一種方式,對接受到的字符進行解碼,,再轉(zhuǎn)碼,。
B, Get走的是url提交,,而在進入url之前已經(jīng)進行了iso8859-1的編碼處理,。要想影響這個編碼則需要在server.xml的Connector節(jié)點增加useBodyEncodingForURI="true"
屬 性配置,即可控制tomcat對get方式的漢字編碼方式,,上面這個屬性控制get提交也是用 request.setCharacterEncoding("UTF-8")所設置的編碼格式進行編碼。所以自動編碼為utf-8,,接受頁面正常接受就 可以了,。
但我認為真正的編碼過程是,tomcat又要根據(jù)
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" URIEncoding=”UTF-8”/>
里面所設置的URIEncoding=”UTF-8”再進行一次編碼,但是由于已經(jīng)編碼為utf-8,,再編碼也不會有變化了,。如果是從url獲取編碼,接受頁面則是根據(jù)URIEncoding=”UTF-8”來進行解碼的,。
4,, 上傳文件時的亂碼解決
上傳文件時,form表單設置的都是enctype="multipart/form-data",。這種方式以流方式提交文件,。如果使用apach的上傳 組件,會發(fā)現(xiàn)有很多亂碼想象,。這是因為apach的先期commons-fileupload.jar有bug,,取出漢字后進行解碼,因為這種方式提交,, 編碼又自動使用的是tomcat缺省編碼格式iso-8859-1,。但出現(xiàn)的亂碼問題是: 句號,逗號,,等特殊符號變成了亂碼,,漢字如果數(shù)量為奇數(shù),則會出現(xiàn)亂碼,,偶數(shù)則解析正常,。
解決方式: 下載commons-fileupload-1.1.1.jar 這個版本的jar已經(jīng)解決了這些bug。
但是取出內(nèi)容時仍然需要對取出的字符進行從iso8859-1到utf-8轉(zhuǎn)碼,。已經(jīng)能得到正常所有漢字以及字符,。
5,Java代碼關于url請求,,接受參數(shù)的亂碼
url的編碼格式,,取決于上面所說的URIEncoding=”UTF-8”。 如果設定了這個編碼格式,,則意味著所有到url的漢字參數(shù),,都必須進行編碼才可以。否則得到的漢字參數(shù)值都是亂碼,,例如
一個鏈接 Response.sendDerect(“/a.jsp?name=張大維”),;而在a.jsp里面直接使用
String name = request.getParameter("name");得到的就是亂碼,。因為規(guī)定了必須是utf-8才可以,,所以,這個轉(zhuǎn)向應該這樣寫:
Response.sendDerect(“/a.jsp?name=URLEncode.encode(“張大維”,”utf-8”),;才可以,。
如 果不設置這個參數(shù)URIEncoding=”UTF-8”,, 會怎么樣呢? 不設置則就使用了缺省的編碼格式iso8859-1。問題又出來了,,第一就是參數(shù)值的個數(shù)如果是奇數(shù)個數(shù),,則就可以正常解析,如果使偶數(shù)個數(shù),,得到最后字 符就是亂碼,。還有就是如果最后一個字符如果是英文,則就能正常解析,,但中文的標點符號仍出現(xiàn)亂碼,。權宜之計,如果您的參數(shù)中沒有中文標點符號,,則可以在參 數(shù)值最后加一個英文符號來解決亂碼問題,,得到參數(shù)后再去掉這個最后面的符號。也可以湊或使用,。
6,, 腳本代碼關于url請求,接受到的參數(shù)亂碼
腳 本中也會進行頁面轉(zhuǎn)向的控制,,也會涉及到附帶參數(shù),,并在接受頁面解析這個參數(shù)的情況。如果這個漢字參數(shù)不進行URIEncoding=”UTF-8”所指 定的編碼處理,,則接受頁面接受到的漢字也是亂碼,。腳本處理編碼比較麻煩,必須有相應的編碼腳本對應文件,,然后調(diào)用腳本中的方法對漢字進行編碼即可,。
7, 關于jsp在MyEclipse中打開的亂碼問題
對 于一個已經(jīng)存在的項目,,Jsp文件的存儲格式可能是utf-8,。如果新安裝的eclipse,則缺省打開使用的編碼格式都是iso8859-1,。所以導致 jsp里面的漢字出現(xiàn)亂碼,。這個亂碼比較容易解決,直接到eclipse3.1的偏好設置里面找到general-〉edidor,,設置為您的文件打開編 碼為utf-8即可,。Eclipse會自動重新以新的編碼格式打開。漢字即可正常顯示,。
8,, 關于html頁面在eclipse中打開出現(xiàn)亂碼情況
由于大部分頁面都是由dreamweaver制作,其存儲格式跟eclipse的識別有差別導致,。
一般這種情況,,在eclipse中新建一個jsp,,直接從dreamweaver復制頁面內(nèi)容粘貼到jsp即可
但我認為真正的編碼過程是,,tomcat又要根據(jù)
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" URIEncoding=”UTF-8”/>
里面所設置的URIEncoding=”UTF-8”再進行一次編碼,,但是由于已經(jīng)編碼為utf-8,再編碼也不會有變化了,。如果是從url獲取編碼,,接受頁面則是根據(jù)URIEncoding=”UTF-8”來進行解碼的。
4,, 上傳文件時的亂碼解決
上傳文件時,,form表單設置的都是enctype="multipart/form-data"。這種方式以流方式提交文件,。如果使用apach的上傳 組件,,會發(fā)現(xiàn)有很多亂碼想象。這是因為apach的先期commons-fileupload.jar有bug,,取出漢字后進行解碼,,因為這種方式提交, 編碼又自動使用的是tomcat缺省編碼格式iso-8859-1,。但出現(xiàn)的亂碼問題是: 句號,,逗號,等特殊符號變成了亂碼,,漢字如果數(shù)量為奇數(shù),,則會出現(xiàn)亂碼,偶數(shù)則解析正常,。
解決方式: 下載commons-fileupload-1.1.1.jar 這個版本的jar已經(jīng)解決了這些bug,。
但是取出內(nèi)容時仍然需要對取出的字符進行從iso8859-1到utf-8轉(zhuǎn)碼。已經(jīng)能得到正常所有漢字以及字符,。
5,,Java代碼關于url請求,接受參數(shù)的亂碼
url的編碼格式,,取決于上面所說的URIEncoding=”UTF-8”,。 如果設定了這個編碼格式,則意味著所有到url的漢字參數(shù),,都必須進行編碼才可以,。否則得到的漢字參數(shù)值都是亂碼,例如
一個鏈接 Response.sendDerect(“/a.jsp?name=張大維”),;而在a.jsp里面直接使用
String name = request.getParameter("name"),;得到的就是亂碼。因為規(guī)定了必須是utf-8才可以,,所以,,這個轉(zhuǎn)向應該這樣寫:
Response.sendDerect(“/a.jsp?name=URLEncode.encode(“張大維”,”utf-8”),;才可以。
如 果不設置這個參數(shù)URIEncoding=”UTF-8”,, 會怎么樣呢? 不設置則就使用了缺省的編碼格式iso8859-1,。問題又出來了,第一就是參數(shù)值的個數(shù)如果是奇數(shù)個數(shù),,則就可以正常解析,,如果使偶數(shù)個數(shù),得到最后字 符就是亂碼,。還有就是如果最后一個字符如果是英文,,則就能正常解析,但中文的標點符號仍出現(xiàn)亂碼,。權宜之計,,如果您的參數(shù)中沒有中文標點符號,則可以在參 數(shù)值最后加一個英文符號來解決亂碼問題,,得到參數(shù)后再去掉這個最后面的符號,。也可以湊或使用。
6,, 腳本代碼關于url請求,,接受到的參數(shù)亂碼
腳 本中也會進行頁面轉(zhuǎn)向的控制,也會涉及到附帶參數(shù),,并在接受頁面解析這個參數(shù)的情況,。如果這個漢字參數(shù)不進行URIEncoding=”UTF-8”所指 定的編碼處理,則接受頁面接受到的漢字也是亂碼,。腳本處理編碼比較麻煩,,必須有相應的編碼腳本對應文件,然后調(diào)用腳本中的方法對漢字進行編碼即可,。
7,, 關于jsp在MyEclipse中打開的亂碼問題
對 于一個已經(jīng)存在的項目,Jsp文件的存儲格式可能是utf-8,。如果新安裝的eclipse,,則缺省打開使用的編碼格式都是iso8859-1。所以導致 jsp里面的漢字出現(xiàn)亂碼,。這個亂碼比較容易解決,,直接到eclipse3.1的偏好設置里面找到general-〉edidor,設置為您的文件打開編 碼為utf-8即可,。Eclipse會自動重新以新的編碼格式打開,。漢字即可正常顯示。
8,, 關于html頁面在eclipse中打開出現(xiàn)亂碼情況
由于大部分頁面都是由dreamweaver制作,,其存儲格式跟eclipse的識別有差別導致,。
一般這種情況,在eclipse中新建一個jsp,,直接從dreamweaver復制頁面內(nèi)容粘貼到jsp即可
2008-02-11 11:54
在使用JSP的過程中,,最使人頭疼的一個問題就是中文亂碼問題,以下是我在軟件開發(fā)中遇到的亂碼問題以及解決方法,。
1,、JSP頁面亂碼
這種亂碼的原因是應為沒有在頁面里指定使用的字符集編碼,,解決方法:只要在頁面開始地方用下面代碼指定字符集編碼即可,,<%@ page contentType="text/html; charset=utf-8" %>
2、數(shù)據(jù)庫亂碼
這種亂碼會使你插入數(shù)據(jù)庫的中文變成亂碼,,或者讀出顯示時也是亂碼,,解決方法如下:
在數(shù)據(jù)庫連接字符串中加入編碼字符集
String Url="jdbc:mysql://localhost/digitgulf?user=root&password=root&useUnicode=true&characterEncoding=utf-8";
并在頁面中使用如下代碼:
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
3、中文作為參數(shù)傳遞亂碼
當我們把一段中文字符作為參數(shù)傳遞個另一頁面時,,也會出現(xiàn)亂碼情況,,解決方法如下:
在參數(shù)傳遞時對參數(shù)編碼,比如
RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
然后在接收參數(shù)頁面使用如下語句接收
keywords=new String(request.getParameter("keywords").getBytes("8859_1"));
以上為現(xiàn)階段遇到的亂碼問題,,亂碼的核心問題還是字符集編碼問題,,只要掌握了這一點,一般的亂碼問題都可以解決,。