new String(str.getBytes("8859-1"),"gb2312") 你們一看就知道,這就是咱們用來對付jsp裏中文亂碼用的東西。 可是今天研究jdk中對String類的相關說明的時候,卻發現讀不懂這條語句。 你們都知道,Java中的String類中的數據都是用Unicode編碼的字符數組來保存的(保存的數據的編碼並不見得是正確的Unicode編碼,就像咱們的Jsp頁面裏的中文,都是錯的)。另外一方面, 按照jdk的說明,str.getBytes("8859-1")的做用是將字符串str中的字符數組以ISO8859_1的格式編碼爲字節數組。 而new String(bytes, "gb2312")的做用是將字節數組bytes以GB2312的格式解碼爲字符數組。 當把三者聯繫起來之後,咱們獲得的關於new String(str.getBytes("8859-1"),"gb2312")語句的功能天然就是: 將字符串str中以Unicode字符數組(此時的字符數組並非正確編碼了中文字符的Unicode字符數組)保存的數據,以ISO8859_1的格式編碼爲字節數組,再將該字節數組以GB2312的格式解碼爲字符數組並保存到Unicode字符數組中(此時的字符數組是正確編碼了中文字符的Unicode字符數組)。 若是是這樣的話,至關於什麼呢?至關於咱們把一個文件用zip格式進行壓縮,而後用rar格式來解壓縮。其結果可想而知。 可是目前的實際狀況是,new String(str.getBytes("8859-1"),"gb2312")工做得很是正常。 而理論上應當正常工做的下面這條語句,實際上沒法正常運行: new String((new String(str.getBytes("8859-1"), "8859-1")).getBytes("GB2312")) (此語句的功能應當是:將字符串str中以Unicode字符數組(此時的字符數組並非正確編碼了中文字符的Unicode字符數組)保存的數據,以ISO8859_1的格式編碼爲字節數組,再將該字節數組以ISO8859_1格式解碼爲字符數組並保存到Unicode字符數組中(此時的字符數組是正確編碼了中文字符的Unicode字符數組)。而後將這個正確編碼了中文字符的Unicode字符數組中的數據以GB2312格式編碼爲字節數組並轉換爲一個GB2312格式編碼的Unicode字符數組。