java 亂碼 字符集編碼
程式經常出現亂碼怎麼辦?下面仔細說一下
首先計算機儲存的一切都是位元組,只認識位元組,也就是一串的二進位制數字。
而字元的儲存是需要先通過字符集編碼轉換成可儲存的“二進位制數字”。而出現亂碼的原因基本上都是在這個階段出現的。也就是通過字符集編碼轉換階段。比如:‘中’字元想儲存到計算機上,需要先通過XX字元編碼轉換然後儲存到計算機上,而在其他計算機(B)上讀取的時候,因為計算機內部儲存的是二進位制,此時B計算機從硬碟上讀取到二進位制數值通過YY字元編碼進行轉換,然後顯示,此時,如果XX編碼與YY編碼如果不相容的話,那麼就會出現亂碼;如果兩套編碼相容,就不會出現亂碼。
acsii編碼使用7個二進位制位對字元編碼。因為計算機基本儲存單元是位元組,所以採用一個位元組對字元編碼。(1byte = 8bit ,一個位元組由8位表示,所以在計算機內部最高位為0,其他7位是編碼值)。
ansi編碼:為了擴充acsii編碼,以用於顯示本國語言,不同的國家和地區制定了不同的標準,由此產生了GB2312,BIG5,JIS等各自的編碼標準。這些使用兩個位元組來代表一個字元的各種漢字延伸編碼方式,稱為ansi編碼,又稱為mbcs。(Muilti-Bytes Charecter Set,多位元組字符集)
unicode:如ansi編碼條例中所述,世界上存在著多種編碼方式。在ansi編碼下,同一個編碼值,在不同的編碼體系裡代表著不同的字。這個問題促使了unicode編碼誕生:將世界上所有符號都納入其中,無論中文、英文、日文等,每個符號都對應一個唯一的編碼,大家都使用這個編碼表,就不會出現亂碼了,這就是unicode編碼。缺點:很大的集合,雖然統一了編碼,但是效率不高。(例如儲存英文的話,前三個位元組都是0,最後一個位元組才是真正的儲存值,浪費空間)
utf-8:為了提高unicode編碼效率,出現了utf-8編碼。utf-8可以根據不同的編碼自動選擇編碼長短,比如英文字母使用一個位元組就夠了。utf-8編碼是在unicode編碼值上通過utf-8編碼器再一次的編碼得出來的。
base64:把由其他編碼儲存的符號轉換成acsii碼。
到這裡,如果出現了亂碼,相信也會知道怎麼解決了吧。
由什麼編碼集儲存的就由什麼編碼集轉換顯示。
最好採用utf8編碼集。因為通用。
文章有不當之處,歡迎指出。