JSP/Servlet亂碼問題

一、最基本的亂碼問題。

這個亂碼問題是最簡單的亂碼問題。通常新會出現。就是頁面編碼不一致致使的亂碼。

<%@ 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文件的存儲格式。MyEclipse會根據這個編碼格式保存文件。並編譯jsp文件,包括裏面的漢字。

第二處編碼爲解碼格式。由於存爲UTF-8的文件被解碼爲iso8859-1,這樣若有中文確定出亂碼。也就是必須一致。而第二處所在的這一行,能夠沒有,缺省是使用iso8859-1的編碼格式。因此若是沒有這一行的話,「我是個好人」也會出現亂碼。存儲編碼和解碼編碼格式必須一致才能夠。

第三處編碼爲控制瀏覽器的解碼方式。若是前面的解碼都一致而且無誤的話,這個編碼格式沒有關係。有的網頁出現亂碼,就是由於瀏覽器不能肯定使用哪一種編碼格式。由於頁面有時候會嵌入頁面,致使瀏覽器混淆了編碼格式。出現了亂碼。

 

 

 

二、 表單使用Post方式提交後接收到的亂碼問題

這個問題也是平時咱們最常遇到的亂碼問題。這個亂碼是tomcat的內部編碼格式iso8859-1在搗亂,也就是說post提交時,若是沒有設置提交的編碼格式,則會默認以iso8859-1方式進行提交,接受的jsp卻以utf-8的方式接受。致使亂碼。既然這樣的緣由,下面有幾種解決方式,並比較。

A 接受參數時進行編碼轉換

String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8");這樣的話,對每個提取的字符串都進行轉碼。確實能夠拿到漢字,但比較麻煩。

B 在請求頁面上開始處,執行請求的編碼代碼, request.setCharacterEncoding("UTF-8"),把提交內容的字符集設爲UTF-8。這樣的話,接受此參數的頁面就沒必要在轉碼了。直接使用

String str = request.getParameter("something");便可獲得漢字參數。但每頁都須要執行這句話。

這個方法也就對post提交的有效果,對於get提交和上傳文件時的enctype="multipart/form-data"是無效的。

C 爲了不每頁都要寫request.setCharacterEncoding("UTF-8"),建議使用過濾器對全部jsp

  進行編碼處理(即用filter對每一個請求裏面的數據都從新進行編碼),效果顯著。

 

 

3 表單get提交方式的亂碼處理方式。

若是使用get方式提交中文,接受參數的頁面也會出現亂碼,這個亂碼的緣由也是tomcat的內部編碼格式iso8859-1致使。Tomcat會以get的缺省編碼方式iso8859-1對漢字進行編碼,編碼後追加到url,致使接受頁面獲得的參數爲亂碼。

解決辦法:

A 使用上例中的第一種方式,對接受到的字符進行解碼,再轉碼。

B Get走的是url提交,而在進入url以前已經進行了iso8859-1的編碼處理。要想影響這個編碼則須要在

server.xml的Connector節點增長useBodyEncodingForURI="true"

屬性配置,便可控制tomcat對get方式的漢字編碼方式,上面這個屬性控制get提交也是用

request.setCharacterEncoding("UTF-8")所設置的編碼格式進行編碼。因此自動編碼爲utf-8,接受頁面正常接受就能夠了。但我認爲真正的編碼過程是,tomcat又要根據

<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」再進行一次編碼,可是因爲已經編碼爲utf-8,再編碼也不會有變化了。若是是從url獲取編碼,接受頁面則是根據URIEncoding=」UTF-8」來進行解碼的。值得注意的是,一旦肯定了URIEncoding=」UTF-8」,例如Response.sendDerect(「/a.jsp?name=哈嘍」),在a.jsp裏面直接取得話,會出現亂碼,因爲規定了URL編碼,則轉向必須爲Response.sendDerect(「/a.jsp?name=URLEncode.encode(「哈嘍」,」utf-8」)才能夠。<span yes';="" font-size:10.5000pt;="" font-family:'times="" new="" roman';="" "=""> 
相關文章
相關標籤/搜索