字符編碼基本概念:
JAVA中通常有char、byte、String這幾個概念。char指的是一個UNICODE字符,為16位的整數(shù)。byte是字節(jié),字符串在網(wǎng)絡傳輸或存儲前需要轉(zhuǎn)換為byte數(shù)組。在從網(wǎng)絡接收或從存儲設備讀取后需要將byte數(shù)組轉(zhuǎn)換成String。String是字符串,可以看成是由char組成的數(shù)組。String和char為內(nèi)存形式,byte是網(wǎng)絡傳輸或存儲的序列化形式
編碼方式的簡介
String序列化成byte數(shù)組或反序列化時需要選擇正確的編碼方式。如果編碼方式不正確,就會得到一些0x3F的值。常用的字符編碼方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。ISO8859_1用來編碼拉丁文,它由單字節(jié)(0-255)組成。GB2312、GBK用來編碼簡體中文,它有單字節(jié)和雙字節(jié)混合組成。最高位為1的字節(jié)和下一個字節(jié)構成一個漢字,最高位為0的字節(jié)是ASCII碼。UTF-8/UTF-16/UTF-32是國際標準UNICODE的編碼方式。 用得最多的是UTF-8,主要是因為它在對拉丁文編碼時節(jié)約空間。
Java SE API中關于編碼操作的常用方法
String str = "中國";
// 取得GB2312編碼的字節(jié)
byte[] bytesGB2312 = str.getBytes("GB2312");
// 取得平臺缺省編碼的字節(jié)(windows為GB2312)
byte[] bytesDefault = str.getBytes();
// 用指定的編碼將字節(jié)轉(zhuǎn)換成字符串
String newStr = new String(bytesGB2312, "GB2312");
// 用平臺缺省的編碼將字節(jié)轉(zhuǎn)換成字符串(solaris為ISO8859_1,windows為GB2312)
String newDefaultStr = new String(bytesDefault);
// 用指定的編碼從字節(jié)流里面讀取字符
InputStream in = new FileInputStream(new File("1.txt"));
InputStreamReader reader = new InputStreamReader(in, "GB2312");
char aChar = (char) reader.read();
當通過瀏覽器向tomcat發(fā)出請求訪問servlet時,服務器將請求信息和響應信息封裝在request和response對象交給響應的servlet處理,程序中的字符串默認按ISO-8859的查找和輸出
案例1.
提交頁面編碼為:GBK
servlet編碼為系統(tǒng)默認
String username = request.getParameter("username");
System.out.println(username);
結(jié)果如圖
分析如下,當request.getParameter("username");獲得客戶端表
單信息時,默認安裝ISO-8859的編碼解碼,然后輸出到控制臺,出現(xiàn)字符編碼不一致產(chǎn)生亂碼
解決辦法 是在servlet方法頭部添加
request.setCharacterEncoding("GBK");
如圖
案例2.
例如:對于輸出:response.getwrite().write("中國"),在瀏覽器中顯示亂碼:
應為response.getwrite().write("中國"),默認按照ISO-8859編碼響應服務器發(fā)送“中國”,而我們用的瀏覽器默認為GBK或GB2312編碼,從而導致編碼不同產(chǎn)生亂碼
解決辦法:
//設置resposne的碼表
response.setCharacterEncoding("UTF-8");
//并且要通知瀏覽器以相應格式打開:
response.setContentType("text/html;charset=UTF-8");