java 采用unicode 編碼來處理字符。Java 程序無論是從/往文件系統(tǒng)以字符流讀/寫文件,還是往URL 連接寫 HTML 信息,或從URL 連接讀取參數(shù)值,都會(huì)有字符編碼的轉(zhuǎn)換。編/解碼過程如下圖:
亂碼產(chǎn)生的根源是由于編碼和解碼采用的不是同一種碼(gbk,utf-8,iso8859-1)。 字符串(String 或char[])"123你" 經(jīng)過java 編碼后的字節(jié)流(unicode 字節(jié)流)為31 00 32 00 33 00 60 4f。如果你用new String("123你".getBytes("iso8859-1"), "gbk") 就會(huì)產(chǎn)生亂碼。 因?yàn)間etBytes("iso8859-1") 取得的是"123你" 經(jīng)過iso8859-1 編碼后的字節(jié)流31 32 33 3f(iso8859字節(jié)流),而在用new String(bytes, "gbk") 構(gòu)造字符串時(shí)java 則將iso8859字節(jié)流(31 32 33 3f)當(dāng)作是unicode 字節(jié)流(因?yàn)閖ava 是采用unicode 來處理字符的,所以它把字節(jié)流統(tǒng)統(tǒng)當(dāng)作是unicode 字節(jié)流),因此它把31 32 33 3f 也看成是unicode 字節(jié)流。而unicode 字節(jié)流(31 32 33 3f)經(jīng)過gbk 編碼后當(dāng)然是123? 了。于是,亂碼產(chǎn)生了。下面的是一個(gè)測(cè)試程序: public class Charset { public static void main(String[] args) { try { byte[] utf8 = str.getBytes("utf-8"); byte[] iso88591 = str.getBytes("iso8859-1"); byte[] gbk = str.getBytes("gbk"); } catch (Exception e) { |
|