【編碼】徹底弄懂ASCII、Unicode、UTF-8之間的關系


計算機中的所有字符,說到底都是用二進制的0、1的排列組合來表示的,因此就需要有一個規范,來枚舉規定每個字符對應哪個0、1的排列組合,這樣的規范就是字符集

 

ASCII

全稱是“美國信息交換標准碼”(American Standard Code for Information Interchange),制定於20世紀60年代,這套規范規定了128個字符對應的二進制碼。128=27,即只需要7個bit就能完全表示,因此每個ASCII碼只需占用1個字節(1Byte = 8bit)。

例如,大寫字母A對應ASCII編碼是01000001。點擊查看完整的ASCII碼表

假如一個文本文件存放了100個ASCII編碼的字符,那么這個文件內容的大小就是100B。

ASCII規范只涵蓋了英文字母、數字和一部分符號(包括換行符、制表符等控制性符號),但世界上還有許多語言的字符需要能夠被計算機系統處理(比如幾萬個漢字),這樣一來就需要制定一個比ASCII大得多的字符集,足夠把全世界所有字符都囊括進去。這個字符集就是Unicode。

 

Unicode

這是全世界最大的字符集,相對於ASCII碼,Unicode大大擴展了編碼位數到16 - 32位,意味着它理論上最多可以容納 232≈42億 個字符。Unicode包含了各種字母、中日韓文字、emoji等幾乎所有語言和領域的符號,如漢字“我”對應的Unicode是01100010 00010001,寫成16進制就是6211。現在互聯網上傳遞、展示所使用的編碼基本都是Unicode。它的最低7位與ASCII碼是完全兼容的,即如果用16位Unicode來表示大寫字母A,就會寫成00000000 01000001。

 

UTF-8

Unicode覆蓋面很廣,但如果一定要用16乃至32位來存儲和傳輸每個符號,對於主要使用ASCII碼的西方用戶,勢必會出現大量僅僅用於補位的0位,造成硬件資源浪費。為此,人們發明了UFT-8編碼,使用可變的位數來表示Unicode里的字符。

UTF-8是怎么做的呢?

1.  對於單字節就可表示的字符,第一位為0,后面7位為該字符的ASCII碼

2. 對於需要≥2個字節才可表示的字符,第一個字節以1開頭,且該字符總共占了幾個字節,就插入幾個連續的1;連續的1結束后,插入一個0。后續字節全部以01開頭。

如下表所示(表格來自阮一峰老師的博客

Unicode符號范圍      |        UTF-8編碼方式
  (十六進制)         |          (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


將“我”編碼成UTF-8的操作方法如下:
“我”的Unicode碼是6211,對應表里3字節編碼的區間。在Unicode二進制碼相應位置插入控制位,得到
11100110 10001000 10010001
寫成16進制就是E68891,這樣就得到了UTF-8編碼。

當然,對於一般的開發者來說,編碼細節是次要的,只要知道是怎么一回事就行了~


所以,當一個HTML頁面被添加了<meta charset="utf-8">標簽時,計算機就知道,每當這個頁面文本的字節流里發現一個E68891,就應該把它視為“我”字。但假如頁面編碼時不是遵循的UTF-8,而是GB2132(它和UTF-8毫無關系),那么就會出現亂碼——計算機錯誤解讀了這些字節的意思。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM