java中字元編碼格式對中文的影響
阿新 • • 發佈:2019-02-08
中文字元以不同的編碼格式會佔用不同的位元組數,以gbk編碼每一箇中文字元會佔據兩個位元組,以utf-8編碼每個中文字元會佔據3個位元組。
public class Test { public static void main(String[] args) throws UnsupportedEncodingException { String name="中文"; System.out.println(name); byte[] a=name.getBytes("UTF-8"); byte[] b=name.getBytes("gbk"); byte[] c=name.getBytes("ISO-8859-1"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+"*"); } System.out.println(); for(int i=0;i<b.length;i++){ System.out.print(b[i]+"*"); } System.out.println(); for(int i=0;i<c.length;i++){ System.out.print(c[i]+"*"); } System.out.println(); /* System.out.println(new String(a,"UTF-8")); System.out.println(new String(b,"gbk")); System.out.println(new String(c,"ISO-8859-1"));*/ name= new String(b,"ISO-8859-1"); System.out.println(name); byte[] d=name.getBytes("ISO-8859-1"); for(int i=0;i<d.length;i++){ System.out.print(d[i]+"*"); } System.out.println(); name= new String(b,"UTF-8"); System.out.println(name); byte[] e=name.getBytes("UTF-8"); for(int i=0;i<e.length;i++){ System.out.print(e[i]+"*"); } System.out.println(); } }
程式執行結果:
中文
-28*-72*-83*-26*-106*-121*
-42*-48*-50*-60*
63*63*
ÖÐÎÄ
-42*-48*-50*-60*
����
-17*-65*-67*-17*-65*-67*-17*-65*-67*-17*-65*-67*
UTF-8
結果中 “中文”字串以gbk編碼獲取位元組陣列,陣列的長度4說明每個字元佔據2個位元組,以utf-8編碼獲取位元組陣列,陣列的長度為6說明每個字元佔據3個位元組.
而且以utf-8編碼解析以gbk編碼格式獲取的位元組陣列得到的字串是亂碼,這個過程也是不可你轉的,通過亂碼的字串是獲得不到正確的gbk編碼格式的位元組陣列,因為解析過程中兩編碼格式每個字元所佔據的位元組不同,造成了過程的不可逆。然而ISO-8859-1每個位元組對應一個字元,所以可以通過亂碼的字串獲取到正確的位元組陣列從而解析出正確字串。
java web 中以url形式傳遞中文引數直接取出來的字元是亂碼的,頁面傳遞過來的中文會以位元組陣列的形式傳遞到tomcat伺服器,伺服器預設以ISO-8859-1編碼解析,解析出來的字串亂碼。解決的辦法是獲取亂碼字元的位元組陣列,然後以頁面字元編碼重新解析位元組陣列就可以獲得正確的字串。