從網上辛 ( sui ) 辛 ( sui ) 苦 ( bian ) 苦 ( bian )找來一份源碼,用編輯器打開,發現註釋各類亂碼,這種狀況相信很多人都遇到過。通過一番查找發現是編碼格式的問題,OK,GB2312 / UTF-8 / Unicode 挨個試,分分鐘解決,可是仔細想一想,真的解決了麼?編輯器
咱們知道,計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字,機器才能處理,而字符編碼,就是將你所認識的各類字符類型轉換爲計算機所認識的字符類型的一種行爲。ui
在計算機被設計出時,採用 8 個比特(bit)做爲一個字節(byte),所以,一個字節能表示的最大整數就是255,若是想要表示更大的整數,就必須使用更多字節。好比,一個字節的最大二進制數 1111 1111 = 255
(十進制),兩個字節的最大二進制數 1111 1111 1111 1111 = 65535
,以此類推。編碼
而因爲計算機是美國人發明的,他們沒有須要以多個字節進行編碼的文字,好比中文須要兩個字節進行編碼,英文、數字、符號只須要一個字節就夠了,所以,最先的編碼格式只包含 127 個字符,也就是大小寫英文字母、數字和符號,這種編碼被稱爲ASCII
編碼,好比大寫字母A
的編碼是65
,小寫字母a
的編碼是97
。設計
GB2312
是中國製定的編碼,其目的就是解決ASCII
編碼不適用於中文的問題,且不能和 ASCII
編碼衝突。GB2312
是國內最先制定的漢字編碼,目前最經常使用的是GBK18030
編碼,另外還有GBK
編碼。GBK18030
編碼共收錄 27484 個漢字,同時包含藏文、蒙文、維吾爾文等主要少數民族文字,如今Windows平臺必需要支持 GBK18030
編碼。code
咱們能夠想到的是,全世界上百種語言,日本有日文編碼,韓國有韓文編碼,各國有各自的標準,不可避免的會出現衝突,這就會致使一個問題,即在多語言混合的文本中,顯示出來必然會有亂碼。針對這一問題,產生了Unicode
編碼,**它把全部語言都統一到一套編碼裏,這樣就不會再有亂碼問題。內存
大一統以後,亂碼問題解決了,可是又有了新的問題。好比,採用Unicode
編碼進行純英文文檔編輯,咱們知道英文只須要一個字節就能知足編碼,那麼在Unicode
編碼格式下,只須要在 ASCII 編碼下英文的二進制數前面補 0 就能夠了,例如A
的ASCII
編碼是01000001
,對應Unicode
編碼就是00000000 01000001
。這就致使存儲成本的提高,對於全英文文本而言,Unicode
編碼比ASCII
編碼多出一倍的存儲空間,在存儲和傳輸上都十分不划算。文檔
那麼如何解決上述問題?一條合理的思路是,實現一套可伸縮的編碼格式,即根據所編碼字符的實際有效長度進行編碼,進而出現了UTF-8
編碼。UTF-8
編碼把一個Unicode
字符根據不一樣的數字大小編碼成 1-6 個字節,經常使用的英文字母被編碼成 1 個字節,漢字一般是 3 個字節,只有很生僻的字符纔會被編碼成 4-6 個字節。源碼
在這一編碼格式下,若是你要傳輸的文本包含大量英文字符,用UTF-8
編碼就能節省空間:it
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
經過表格還能夠發現,UTF-8 編碼還有一個額外好處,就是 ASCII 編碼實際上能夠被當作是 UTF-8 編碼的一部分,因此,大量只支持 ASCII 編碼的歷史遺留軟件能夠在 UTF-8 編碼下繼續工做。字符編碼
搞清楚什麼是 ASCII、Unicode 以及 UTF-8 以後,咱們總結一下字符編碼的工做方式: 內存中統一使用Unicode
編碼,當須要保存到硬盤或進行傳輸的時候,就轉換爲UTF-8
編碼。 用記事本編輯時,從文件讀取的UTF-8
字符被轉換爲Unicode
字符到內存中,編輯完成後,在保存時再將Unicode
轉換爲UTF-8
。