中文亂碼問題產(chǎn)生的由來
在計算機中,只有二進制的數(shù)據(jù),不管數(shù)據(jù)是在內(nèi)存中,還是在外部設(shè)備上。
對于我們所看到的字符,也是以二進制數(shù)據(jù)的形式存在的。不同的字符對應(yīng)的
二進制數(shù)的規(guī)則,就是字符的編碼。字符編碼的集合稱為字符集。
常用的字符集
1 ASCII
2 ISO8859-1
3 GB2312和GBK
每個國家(或者區(qū)域)都規(guī)定了計算機信息交換用的字符編碼集,這就造成了
交流上的困難。想象一下,你發(fā)送一封中文郵件給一位遠在西班牙的朋友,當(dāng)郵件
通過網(wǎng)絡(luò)發(fā)送出去的時候,你所書寫的中文字符會按照本地的字符集GBK轉(zhuǎn)換成二進制
編碼數(shù)據(jù),然后發(fā)送出去。當(dāng)你的朋友接收以郵件(二進制數(shù)據(jù))后,查看信件時,會
按照他所用的系統(tǒng)的字符集,將二進制數(shù)據(jù)解碼為字符,然而由于兩種字符集之間編碼
規(guī)則的不同,導(dǎo)致轉(zhuǎn)換出現(xiàn)亂碼。這是因為,在不同的字符集之間,同樣的數(shù)字可能對
應(yīng)了不同的符號,也可能在另一種字符集中,該數(shù)字沒也對應(yīng)的符號。
為解決上述問題,統(tǒng)一全世界的字符編碼,由Unicode協(xié)會制定并發(fā)布了Unicode編碼。
4 Unicode
5 UTF-8
對亂碼產(chǎn)生過程的分析
字符數(shù)據(jù)在各種不同的字符集之間轉(zhuǎn)換時,就有可能會出現(xiàn)亂碼。
xml處理器在沒有被預(yù)先通知的情況下會默認文檔數(shù)據(jù)為UTF-8格式。
這樣在你書寫xml文檔時,就存在了UTF-8字符集和本地字符進行轉(zhuǎn)換的過程。
當(dāng)向xml文檔中寫入數(shù)據(jù)的時候,需要將本地字符集編碼的數(shù)據(jù)轉(zhuǎn)換為UTF-8
,而在輸出字符數(shù)據(jù)的時候,則需要將UTF-8編碼轉(zhuǎn)換為本地字符集編碼。
從上述的過程來看,寫入和輸出的過程是可逆的。理應(yīng)不會出現(xiàn)中文亂碼問題
然而,實際應(yīng)用的情形,比上述的過程要復(fù)雜的多。在WEB應(yīng)用中,通過都包括
瀏覽器、WEB服務(wù)器、WEB應(yīng)用程序和數(shù)據(jù)庫等部分,每一部分的都有可能使用不
同的字符集,從而導(dǎo)致數(shù)據(jù)在各種字符之間轉(zhuǎn)換時,出現(xiàn)了亂碼問題。