ASCII, Unicode, UTF-8, 8進制, 16進制等各種編碼學習理解筆記


字符編碼的發展歷史

Unicode和UTF-8有何區別?

在這個問題下的於洋的最高票回答中,比較完整地介紹了字符編碼的發展歷史,為了便於記憶,再次簡要概括一番。

一個字節:最初一個字節的標准是混亂的,出現過4位、6位、7位的一字節標准,最終由於歷史原因和物理存儲需求(8位是2的3次方,方便物理存儲),所以采用了8位為一個字節的標准。

ASCII:定下了8位為一個字節后,那么一個字節可以表示的狀態就有256種(2^8),對應0-255號。接下來就需要考慮8位如何表示一個字符了,ASCII碼顧名思義(American Standard Code for Information Interchange)就是美國的信息交換標准碼,因此只需要表示出英文字母和少數的標點符號以及操作控制符號即可,於是人們把這些需要編碼的字符編到了0-127號(包括127),這種編碼方式就是ASCII碼。后來為了滿足更多地區的字符編碼的需求,127號之后的位置也被編碼了字符,包含了127號之后的ASCII碼被稱為擴展ASCII碼

GB2312等: 但是一個字節最多只能編碼256個字符,對於世界上的語言字符來說遠遠不夠,比如中文的漢字就有許許多多,因此中國采用了GB2312GBKGB18030等雙字節字符集(DBCS)的編碼方案,還有各個地區和語言采用了各自的編碼方案,編碼方案不統一的問題就造成了很大的困擾。

Unicode:面對這種困擾的局面,國際標准化組織(ISO)決定來解決這個問題,他們做了一個包含了地球上所有文化、字母、符號的編碼方案Unicode,並且統一采用雙字節,對於原來的單字節的符號,低位編碼不變,擴展其高位為0變為雙字節符號,這樣就解決了標准與統一的問題。

但是Unicode也有一些問題,一是計算機如何區分編碼為Unicode字符還是兩個ASCII字符,二是半角符號(就是原來的ASCII方案里的一字節字符)只占用了一個字節的空間,Unicode占用了雙倍的空間,對於英文字母等半角字符來說,直接多占用了一倍的空間,這是極大的浪費。因此,Unicode在很長的一段時間內難以推廣。

UTF:直到后來UTF(UCS Transfer Format)標准的出現,Unicode才得到更好的使用。UTF是一種字符在網絡上的傳輸方案,專為數據傳輸而設計,UTF-16就是一次傳輸16位的數據,UTF-8就是一次傳輸8位的數據。其中UTF-8是使用最廣的一種Unicode的實現方式,它的一大特點就是它是一種變長度的編碼方式,當字符在ASCII碼范圍內是,使用一個字節代表一個字符,字符在別的范圍內時,又是另外的長度,比如中文使用三個字節的長度。UTF-8通過一些算法和規則來實現Unicode的轉換。

而在javascript中,\u表示使用Unicode編碼,比如\u0078表示字符x,\x表示使用16進制的ASCII碼,比如\x78也表示x,\[0-7][0-7][0-7]表示使用8進制的ASCII嗎,比如\170表示x。

總結:

編碼方案最初為ASCII碼,且只用了0-127號,后來由於需要使用更多字符的原因,發展為擴展ASCII碼,之后由於各個地區和語言的不同,出現了許多編碼標准,比如中國的GB2312等。面臨這種局面,ISO制定了Unicode來實現編碼的統一,由於Unicode的一些缺點,沒有得到更大的推廣。直到UTF,尤其是UTF-8這些傳輸方案的出現,Unicode得到了大范圍的使用。

另外在Javascript中,\u表示使用Unicode編碼,[0-7][0-7][0-7]表示使用8進制的ASCII碼,\x表示使用16進制的ASCII碼。


免責聲明!

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



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