天天看點

亂碼的由來

看了很多關于亂碼的文章,總覺得不夠清晰,看的雲裡霧裡。在一本書上看到解釋還比較清楚,摘下。

計算機中,字元都是以二進制的數字來存儲的,這種字元與數字對應的關系就被稱為字元的編碼。例如"a"對應的編碼是65,這個65就是"a"的ascii編碼。

從計算機的字元編碼發展曆史來看,大概經曆了三個階段。

(1)第一個階段是ascii英文編碼階段,這個時候隻支援英語,其他語言不能夠在計算機上存儲和顯示。

(2)第二個階段是ascii多種語言編碼的階段,為使計算機支援更多語言,通常使用多個ascii碼組合來表示一個字元,例如漢字通常使用2個位元組的ascii編碼來存儲。這種編碼方式稱為ansi編碼。但是,不同的國家和地區制定了不同的标準,由此産生了gb2312,big5,jis等各自的編碼标準。在簡體中文系統下,ansi編碼代表gb2312編碼,在日文作業系統下,ansi編碼代表jis編碼。不同ansi編碼之間互不相容。如果儲存和打開的編碼方式不同,就會出現亂碼的情況。

(3)第三個階段是unicode階段。為了使國際間資訊交流更加友善,國際組織制定了unicode字元集,為各種語言中的每一個字元設定了統一并且唯一的數字編号,以滿足跨語言、跨平台進行文本轉換,處理的要求。現在大部分的作業系統和語言都提供了對unicode的支援。

 unicode編碼時,每個字元會占用4個位元組的空間。如果字元中存在大量的英文字母,無疑使用unicode會浪費許多資源,是以unicode的編碼方式也出現了許多中分化,utf-8是其中最靈活和常用的編碼之一,它在表示傳統的ascii字元時依然隻是用1個位元組存儲,而其他字元不變。這種方式可以節約空間,還可以保證向後與ascii相容。

俗話說解鈴還須系鈴人,要保證能夠正确的解釋字元,不出現亂碼的情況,關鍵在于選擇正确的編碼方式進行解碼。