http請求是以ISO-8859-1的編碼來傳送url的,如果頁面的content-type為utf-8,那么在發送請求時,會將字符轉成utf-8后進行傳送。
new String(utf_byte,"UTF-8")
utf_byte是【utf-8的字節流】,將該字節流以UTF-8編碼還原為字符串。
如:
"中"的UTF-8編碼為:E4 B8 AD
在請求時為%E4%B8%AD字節之間是%分隔,那么服務器收到這段字節流后,必須將它轉成相應的字符,平時所使用的request.getParameter("name")直接得到了字符串
那么從字節流到字符流這個過程系統己經幫助我們完成了(亂碼的產生由此開始)類似下面的程序:將漢字"中"的UTF-8形式轉成漢字。
publicclassEncodingTest {
publicstaticvoidmain(String[] args) {
String utf_string ="E4%B8%AD";// 中的UTF-8編碼,三個字節表示,用%分開
String[] utf_array = utf_string.split("%");
byte[] utf_byte =newbyte[utf_array.length];
for(inti =0; i < utf_array.length; i++) {
utf_byte[i] = (byte) Integer.parseInt(utf_array[i],16);
}
try{
System.out.println(newString(utf_byte,"UTF-8"));
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
String aa = "中";
bb = aa.getBytes("ISO-8859-1");
new String(bb ,"UTF-8")//這樣肯定是亂碼
因為
一個字符串以【什么樣的編碼】轉換成字節流,就必須以【什么樣的編碼】進行還原
否則亂碼
bb=aa.getBytes("UTF-8");
new String(bb,"UTF-8") ;
言歸正傳:
url通過iso-8859-1傳輸,服務器收到這個字節流,默認會以ISO-8859-1來將這個字節流還原成相應的字符串,就如同這樣:
bb = aa.getBytes("UTF-8");//由用戶傳入的字符串 得到 字節流bb
cc = new String(bb,"ISO-8859-1")//傳到服務器 還原字節流為節符串
request.getParameter("");//獲取到這個cc,那么cc當然亂碼了
所以正確的做法:
new String(request.getParameter("").getBytes("ISO-8859-1"),"UTF-8");
//還原成原始字符串,將亂碼字符串還原成原始的字節流,并重新按UTF-8來編碼。
至于在tomcat中更改URI-Encoding及使用過濾器,我估計是用來更改將字節流轉成字符串的編碼。
知道了問題的原因,那么我們就來說下解決辦法吧。因為我的項目的編碼是UTF-8的,我的項目中使用到字符集過濾器將所有的頁面編碼改為UTF-8。我的解決辦法是修改服務器的的配置:
如果容器是tomcat,配置下它的配置文件/conf/server.xml修改下
connectionTimeout="20000"
redirectPort="8443"/>
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
規定容器的uri編碼試試
個人覺得這樣的解決辦法不怎么好