Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基於字節流的,如果Java和JSP編譯成class文件過程中,使用的編碼方式與源文件的編碼不一致,就會出現亂碼。基於這種亂碼,建議在Java文件中儘量不要寫中文(註釋部分不參與編譯,寫中文沒關係),如果必須寫的話,儘量手動帶參數-ecoding GBK或-ecoding gb2312編譯;對於JSP,在文件頭加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gbk"%>基本上就能解決這類亂碼問題。

 

 

1.在tomcat  中的server.xml中設置如下: 

<Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000"  URIEnUoding="GBK"    disableUploadTimeout="true" />

2.web.xml中過濾請求

3.放在form中,用hidder隱藏

4.配置在ajax框架(ext,jquery等)的param/baseParams中

5在後台設置setCharacterEncoding("字符集");

6.如果放在url中,可編碼成unicode。函數如下:

function encode64(input) { 
 input = escape(input); 
 var output = ""; 
 var chr1, chr2, chr3 = ""; 
 var enc1, enc2, enc3, enc4 = ""; 
 var i = 0;  do { 
 chr1 = input.charCodeAt(i++); 
 chr2 = input.charCodeAt(i++); 
 chr3 = input.charCodeAt(i++);  enc1 = chr1 >> 2; 
 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
 enc4 = chr3 & 63;  if (isNaN(chr2)) { 
  enc3 = enc4 = 64; 
 } else if (isNaN(chr3)) { 
  enc4 = 64; 
 }  output = output + 
 keyStr.charAt(enc1) + 
 keyStr.charAt(enc2) + 
 keyStr.charAt(enc3) + 
 keyStr.charAt(enc4); 
 chr1 = chr2 = chr3 = ""; 
 enc1 = enc2 = enc3 = enc4 = ""; 
 } while (i < input.length);  return output; 
} function decode64(input) { 
var output = ""; 
var chr1, chr2, chr3 = ""; 
var enc1, enc2, enc3, enc4 = ""; 
var i = 0; // remove all characters that are not A-Z, a-z, 0-9, +, /, or = 
var base64test = /[^A-Za-z0-9/+///=]/g; 
if (base64test.exec(input)) { 
alert("There were invalid base64 characters in the input text./n" + 
"Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='/n" + 
"Expect errors in decoding."); 
} 
input = input.replace(/[^A-Za-z0-9/+///=]/g, ""); do { 
enc1 = keyStr.indexOf(input.charAt(i++)); 
enc2 = keyStr.indexOf(input.charAt(i++)); 
enc3 = keyStr.indexOf(input.charAt(i++)); 
enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); 
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); 
if (enc3 != 64) { 
output = output + String.fromCharCode(chr2); 
} 
if (enc4 != 64) { 
output = output + String.fromCharCode(chr3); 
} chr1 = chr2 = chr3 = ""; 
enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length); 
return unescape(output); 
}

在代碼中response.setContentType("text/html; charset=GBK");


8解決Java亂碼問題的關鍵在於在字節與字符的轉換過程中,你必須知道原來字節或轉換後的字節的編碼方式,轉換時採用的編碼必須與這個編碼方式保持一致。我們以前使用Resin服務器,使用smartUpload組件上傳文件,上傳文件同時傳遞的中文參數獲取沒有亂碼問題。當在Linux中把Resin設置成服務後,上傳文件同時的中文參數獲取出現了亂碼。這個問題困擾了我們很久,後來我們分析smartUpload組件的源文件,因為文件上傳採用的是字節流的方式,裏面包含的參數名稱和值也是字節流的方式傳遞的。smartUpload組件讀取字節流後再將參數名稱和值從字節流中解析出來,問題就出現在smartUpload將字節流轉換成字符串時採用了系統默認的編碼,而將Resin設置成服務後,系統默認的編碼可能發生了改變,因此出現了亂碼。後來,我們更改了smartUpload的源文件,增加了一個屬性charset和setCharset(String)方法,將upload()方法中提取參數語句:

String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );


改成了

String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );