字符編碼雜談

引言

作爲一個程序員,遇見文本亂碼的事情並不少見,而要想解決亂碼的問題,其實關鍵是要知道文件的編碼方式,不妨腦補一下字符編碼的知識,從網上到處收集資料,發現關於字符編碼的知識還是蠻深的,正文從一些起源開始講述,希望大家能有個瞭解。

ASCII碼

大家都知道計算機存儲任何信息,底層統一採用二進制表示,通常說的一字節即8bit,1bit要麼代表0,要麼代表1,而處理通常以字節爲單位來處理,那麼一字節8位就可以組合出256種狀態。上世紀60年代,美國人依據這指定了一套字符編碼方案,對他們的英文字母和常用符號做了與二進制的對應,這被稱爲ASCII碼,一直沿用至今。ASCII碼一共規定了128個字符的編碼,比如空格”SPACE”是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的一位統一規定爲0,或用於通訊安全作奇偶校驗。

混亂期

128個符號編碼對於英語是夠用了,但是對於其他國家卻不夠用,於是一些歐洲國家決定用字節閒置的最高位,這樣就可以擴充到256個字符,前面沿用ASCII碼,對於文字符號不算多的國家,還是夠用的,就算如此,不同國家擴充方式不同,前面雖然ASCII碼兼容,但是後面編碼卻衝突,也就是128-256這區間,同一數字卻表示不同字符,如俄語,法語,希伯來語沿用單字節的擴充衝突。而對於一些亞洲國家的文字就更豐富了,典型的中日韓,而漢語就高達數十萬,於是中國就出現了簡體中文gb2312編碼,採用雙字節,可以表示256x256,即65536種字符。

unicode

正如開頭所說,世界上存在着多種編碼方式,同一個二進制數字可以被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。爲什麼電子郵件常常出現亂碼?就是因爲發信人和收信人使用的編碼方式不一樣。可以想象,如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。當然需要注意的是Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。

utf-8

互聯網的普及,強烈要求出現一種統一的編碼方式。UTF-8就是在互聯網上使用最廣的一種Unicode的實現方式。其他實現方式還包括UTF-16(字符用兩個字節或四個字節表示)和UTF-32(字符用四個字節表示),不過在互聯網上基本不用。重複一遍,這裏的關係是,UTF-8是Unicode的實現方式之一。UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。UTF-8的編碼規則很簡單,只有二條:1)對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。2)對於n字節的符號(n>1),第一個字節的前n位都設爲1,第n+1位設爲0,後面字節的前兩位一律設爲10。剩下的沒有提及的二進制位,全部爲這個符號的unicode碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章