最基本的亂碼問題
這個亂碼問題是最簡單的亂碼問題一般新會出現就是頁面編碼不一致導致的亂碼
Html代碼
<%@ page language=java pageEncoding=UTF%>
<%@ page contentType=text/html;charset=iso%>
<html>
<head>
<title>中文問題</title>
<meta httpequiv=ContentType content=text/html; charset=UTF>
</head>
</head>
<body>
我是個好人
</body>
</html>
三個地方的編碼
第一個地方的編碼格式為jsp文件的存儲格式Ecljpse會根據這個編碼格式保存文件並編譯jsp文件包括裡面的漢字
第二處編碼為解碼格式因為存為UTF的文件被解碼為iso這樣如有中文肯定出亂碼也就是必須一致而第二處所在的這一行可以沒有缺省也是使用iso的編碼格式所以如果沒有這一行的話我是個好人也會出現亂碼必須一致才可以
第三處編碼為控制浏覽器的解碼方式如果前面的解碼都一致並且無誤的話這個編碼格式沒有關系有的網頁出現亂碼就是因為浏覽器不能確定使用哪種編碼格式因為頁面有時候會嵌入頁面導致浏覽器混淆了編碼格式出現了亂碼
表單使用Post方式提交後接收到的亂碼問題
這個問題也是一個常見的問題這個亂碼也是tomcat的內部編碼格式iso在搗亂也就是說post提交時如果沒有設置提交的編碼格式則會以iso方式進行提交接受的jsp卻以utf的方式接受導致亂碼既然這樣的原因下面有幾種解決方式並比較
a 接受參數時進行編碼轉換
String str = new String(requestgetParameter(something)getBytes(ISO)utf)
這樣的話每一個參數都必須這樣進行轉碼很麻煩但確實可以拿到漢字
b 在請求頁面上開始處執行請求的編碼代碼
requestsetCharacterEncoding(UTF)
把提交內容的字符集設為UTF-這樣的話接受此參數的頁面就不必在轉碼了直接使用
String str = requestgetParameter(something)
即可得到漢字參數但每頁都需要執行這句話這個方法也就對post提交的有效果對於get提交和上傳文件時的enctype=multipart/formdata是無效的稍後下面單獨對這個兩個的亂碼情況再進行說明
c 為了避免每頁都要寫requestsetCharacterEncoding(UTF)建議使用過濾器對所有jsp進行編碼處理這個網上有很多例子請大家自己查閱
表單get提交方式的亂碼處理方式
如果使用get方式提交中文接受參數的頁面也會出現亂碼這個亂碼的原因也是tomcat的內部編碼格式iso導致Tomcat會以get的缺省編碼方式iso對漢字進行編碼編碼後追加到url導致接受頁面得到的參數為亂碼/
解決辦法
a 使用上例中的第一種方式對接受到的字符進行解碼再轉碼
b Get走的是url提交而在進入url之前已經進行了iso的編碼處理要想影響這個編碼則需要在serverxml的Connector節點增加useBodyEncodingForURI=true屬性配置即可控制tomcat對get方式的漢字編碼方式上面這個屬性控制get提交也是用requestsetCharacterEncoding(UTF)所設置的編碼格式進行編碼所以自動編碼為utf接受頁面正常接受就可以了但我認為真正的編碼過程是tomcat又要根據
<Connector port=
maxThreads= minSpareThreads= maxSpareThreads=
enableLookups=false redirectPort= acceptCount=
debug= connectionTimeout= useBodyEncodingForURI=true
disableUploadTimeout=true URIEncoding=UTF/>
裡面所設置的URIEncoding=UTF再進行一次編碼但是由於已經編碼為utf再編碼也不會有變化了如果是從url獲取編碼接受頁面則是根據URIEncoding=UTF來進行解碼的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25982.html