目錄
面試回答
知識擴展
Unicode 和 UTF-8 有啥關系?
有了 UTF-8,為什么要出現 GBK
為什么會出現亂碼
面試回答
就像電報只能發出“滴”和“答”聲一樣,計算機只認為 0 和1 兩種字符,但是,人類的文字是多種多樣的,如何把人類的文字轉換成計算機認識的 0、1 字符呢,這個過程同樣需要通過字符編碼。
字符編碼(Character encoding)是一套法則,使用該法則能夠對自然語言的字符的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈沖)進行配對。
和摩爾斯電碼功能類似,上個世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關系,做了統一規定,這被稱為 ASCII 碼,一直沿用至今。
由于 ASCII 只有 128 個字符,雖然對于英文字符都可以表示了,但是世界上還有很多其他的文字是沒辦法表示的,所以需要一種更加全面的字符編碼。
于是又出現了 Unicode 字符集(常見的 Unicode Transformation Format 有:UTF-7,UTF-7.5,UTF-8,UTF-16,以及 UTF-32),除此之外還有一些常用的中文編碼有 GBK,GB2312,GB18030 等。
知識擴展
Unicode 和 UTF-8 有啥關系?
Unicode (中文:萬國碼、國際碼、統一碼、單一碼)是計算機科學領域里的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得計算機可以用更為簡單的方式來呈現和處理文字。
Unicode 備受認可,并廣泛地應用于計算機軟件的國際化與本地化過程。有很多新科技,如可擴展置標語言(Extensible Markup Language,簡稱:XML)、Java 編碼語言以及現代的操作系統,都采用 Unicode 編碼。
Unicode 是一套通用的字符集,包含世界上的大部分文字,也就說,Unicode 是可以表示中文的。
但是,Unicode 雖然統一了全世界字符的編碼,但沒有規定如何存儲。
因為如果 Unicode 統一規定,每個符號就要用三個或四個字節表示,因為字符太多,只能用這么多字節才能表示完全。一旦這么規定,那么每個英文字母前都必然有二到三個字節是0,因為所有英文字母在 ASCII 中都有,都可以用一個字節表示,剩余字節位置就要補充 0,。如果這樣,文本文件的大小會因此大出二三倍,這對于存儲來說是極大的浪費。
為了解決這個問題,就出現了一些中間格式的字符集,他們被稱為通用轉換格式,即 UTF(Unicode Transformation Format)。常用的 UTF 格式與:UTF-7,UTF-7.5,UTF-8,UTF-16,以及 UTF-32。
- UTF-8 使用一至四個字節為每個字符編碼
- UTF-16 使用二或四個字節為每個字符編碼
- UTF-32 使用四個字節為每個字符編碼
所以我們可以說,UTF-8、UTF-16 等都是 Unicode 的一種實現方式。
有了 UTF-8,為什么要出現 GBK
因為 UTF-8 是 Unicode 的一種實現,所以他包含了世界上的所有文字編碼,他采用的是 1-4 字節進行編碼。
對于那些排在前面優先納入的文字,可能就優先使用 1 字節、2字節存儲了,對于納入的文字,就要使用 3 字節或者 4 字節存儲了。
正是因為 UTF-8 太全了,所以那些晚一些納入的字符,在 UTF-8 中的存儲所占的字節數可能就會多一些,那他的存儲空間要求就會很大。
對于常用的漢字,在 UTF-8 中采用 3 字節進行編碼,但是如果有一種只包含中文和 ASCII 的編碼的話,就不需要使用 3 個字節,可能 2 個字節就夠了。
對于大部分網站來說,基本都是只服務一個國家或者地區的,比如一個中國的網站,一般會出現簡體字和繁體字以及一些英文字符,很少會出現日語或者韓文的。
也是出于這樣的考慮,中國國家標準總局于 1981 年制定并實施了 GB 2312-80 編碼,即中華人民共和國國家標準簡體中文字符集。后來廠商微軟利用 GB 2312-80 未使用的編碼空間,收錄 GB 13000.1-93 全部字符制定了 GBK 編碼。
有了標準中文字符集,如果是一個純中文網站,就可以采用這種編碼方式,這樣可以大大節省一些存儲空間的。
常用的中文編碼有 GBK,GB2312,GB18030 等,最常用的是 GBK。
- GB2312(1980年):16位字符集,收錄有 6763 個簡體漢字,682 個符號,共 7445 個字符;
-
- 優點:適用于簡體中文環境,屬于中國國家標準,通行于大陸,新加坡等地也使用此編碼;
- 缺點:不兼容繁體中文,其漢字集合過少
- GBK(1995年):16位字符集,收錄有 21003 個漢字,883 個符號,共 21886 個字符;
-
- 優點:適用于簡繁中文共存的環境,為簡體 Windows 所使用,向下完全兼容 gb2312,向上支持 ISO-10646 國際標準;所有字符都可以一對一映射到 unicode 2.0 上;
- 缺點:不屬于官方標準,和 big5 之間需要轉換;很多搜索引擎都不能很好地支持 GBK 漢字。
- GB18030(2000年):32 位字符集;收錄了 27484 個漢字,同時收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。
-
- 優點:可以收錄所有你能想到的文字和符號,屬于中國最新的國家標準;
- 缺點:目前支持它的軟件較少。
為什么會出現亂碼
文件里面的內容歸根到底都是由 0101 組成的,至于 0101 的二進制碼如何轉成人們可以理解的字符串,則是需要通過規定好的字符編碼標準進行轉換才可以。
我們把一串中文字符通過 UTF-8 進行編碼傳輸給別人,別人拿到這串文字之后,通過 GBK 進行解碼,得到的內容就會是亂碼。