當提到“編碼”的概念,如果只認識UTF-8和GB2312就顯得格局low了,甚至於有非常多人不了解它們是什麽,又代表了怎樣的含義,所以才提出GB2312何時能夠代替UTF-8的問題。
衆所周知目前的機器僅能識別“0”和“1”,也就是說機器只能夠處理數字,想要處理文本,就必須先把文本轉換爲數字機器才能處理。舉個例子:字母“A”是一個字符,在ASCII碼中十進制數“65”就表示字符“A”,用二進制數表示就是“0100 0001”。這時我們就能很好的理解編碼了,編碼表非常像一本字典,只有它的存在二進制數、十進制數、字符之間才能相互轉換,像極了一本密碼本,只有擁有這本密碼本才能相互解密,要不看著就是亂碼。
最早出現的編碼是ASCII,因爲計算機最早是由美國人發明的,存儲能力和性能都受到當時科技發展情況的限制, 所以在當年制定的ASCII標準下, 順理成章地, 只有127個字符被編碼到計算機裡,包括了大小寫英文字母、數字和一些符號。
如果全世界的人都使用英文, 也別用什麽顔文字啊、表情符號啊,那麽編碼後面就不會發生那麽多事了,26個字母大小寫也就是52個,數字0~9,再加上標點符號和其他一些符號,但事實並不是這樣的全世界有上百種語言,所以各國都有各國的編碼標準。比如中國大陸幾乎所有的中文系統和軟體都支持GB2312(GB就是國標的意思),它幾乎滿足了計算機中漢字99.75%的使用頻率,但人名、古漢語等會出現罕用字,所以才出現了後來的GBK、GB18030漢字字符集。
亂碼: 使用錯誤的編碼標準去解釋代碼
過去word文档打開常常就是一堆亂碼,就是編碼導致的,沒有識別到正確的編碼顯示就是亂碼。
因此Unicode字符集編碼就出現了,它將世界上所有語言都統一到了一套編碼裡面,這樣就不會再出現亂碼的問題了,所以操作系統和大多數編程語言就開始直接支持Unicode字符集編碼。
Unicode字符集確實是解決了亂碼的問題,但如果你寫的文本基本都是英文的話,用Unicode編碼會比ASCII編碼需要多出一倍的存儲空間,因爲ASCII編碼是1個字節,而Unicode編碼通常是2個字節。比如字母“A”用ASCII編碼二進制是01000001,而採用Unicode編碼就是00000000 01000001,這樣在存儲和傳輸的效率上就顯得特別的不劃算。於是Unicode編碼就演變爲可變長編碼的UTF-8編碼,常用的英文字母被編碼爲1個字節,漢字通常是3個字節,而一些生僻字符則會編碼成4~6個字節,這樣就能節省存儲資源、提高傳輸的效率。
綜上所述, GB2312是字符中文編碼的一種國家標準,而UTF-8囊括了幾乎所有國家的常用字符編碼,名副其實的成爲了萬國編碼。既然有萬國編碼的存在,爲什麽GB2312又沒有消失呢?這是因爲我們可能還需要顯示一些不同尋常、不常見的漢字,所以就不能完全才有萬國編碼。
要實現UTF-8編碼和GB2312編碼的轉換必須先把UTF-8編碼還原成Unicode編碼,再把Unicode編碼轉化成GB2312編碼,同樣GB2312轉換成UTF-8也是同樣的道理。所以別再提GB2312合適能夠代替UTF-8的問題了,這樣會顯得特別沒有文化。