從計算機的根上學習字符集

字符集基本概念

  • 字符:是計算機世界裏關於文字符號的總稱;包括文字,標點,數字,圖形符號等;例如一個漢字,一個字母,一個逗號。
  • 字符集:一個字符集就是多個字符的有序集合。好比一本字符字典,每個國家字符類型不同,個數也不同,常見的字符集有ASKII字符集,Unicode字符集,GB2312字符集。
  • 字符編碼:由於計算機只能識別二進制的0和1,字符集中的字符,計算機是不能識別的,所以要將字符集轉化爲計算機可以識別的二進制,這個轉化的過程就是字符編碼。簡單可以認爲是將字符集中字符所對應的十進制編號轉化爲二進制,以便讓計算機識別。

小提示
不要將字符與字節搞混,字符是文化符號,而字節是一個長度單位。
使用不同字符集編碼相同的字符內容,所產生的文件大小也是不一樣的。

ASK碼字符集

ASKⅡ編碼:美國標準信息互換碼。
在這裏插入圖片描述
最初的這套編碼只被標識,大寫英文字母,小寫英文字母,數字0到9,所有英文的標點符號,數學運算符,以及一些特殊字符。把所有的這些字符加起來,總共也不超過128個字符。128是2的7次方,所以計算機利用7個bit位就能標識所有字符。後來IMB在此基礎上又擴充了一些字符,就形成了現在的用8個bit位標識所有字符,也就是能標識2的8次方256個字符。
在這裏插入圖片描述

ASK碼是單字節碼,每個字符用8個bit位一個字節就能表示

GB2312

GB2312:簡體中文編碼表。
由於ASK編碼,只能標識256個西方文化符號,當中國人用的時候,已經沒有可用的字節狀態來表示漢字,況且中文光常用的文字就有6000多個。因此中國在ASK碼的基礎之上進行了擴展。前127個單字符編碼不變,127以後用兩個字節16個bit位,來表示一個字符。一個漢字用兩個字節標識,2的16次方是65535,大大提高了漢字字符個數,開始字符集中只有6763個漢字,後來經過擴展又添加了2萬個漢字,形成了後來的GBK編碼。

Unicode字符集

Unicode字符集:萬國碼,統一字符集。
由於世界各國都像中國一樣,各自有一套自己標準的字符集,而且相互之間誰也不懂誰的編碼,無法做到跨平臺,跨語言的支持,所以ISO(國際標準化組織)爲了適應全球化的發展,開始着手解決編碼不統一的問題,捨棄了所有地區性編碼方案,重新搞了一套包括世界上所有文化,字母,符號的編碼,統一字符集,簡稱unicode。

Unicode字符集的特點

  • Unicode字符集中,規定必須用兩個字節,也就是16位來統一表示所有字符。ASK碼中的字符在Unicode中保持不變,長度由8位擴展到16位。高八位用0補齊,所以此方案保存英文文本時會浪費一些空間。
  • Unicode是用兩個字節來標識一個字符,總共可以包含65535個不同字符。
  • Unicode字符集中包含中文字符20902個,第一個是漢字"一"(位置編號爲19968,十六進制是4E00),最後一個漢字是 ”籲“繁體字”籲“(位置編號40869,十進制表示爲:9FA5)。
  • Unicode和GBK最大的區別在於,前127個字符,一個用8位表示,一個用16位表示。
  • Unicode制定時沒有考慮與任何一種編碼兼容。是全新的一套字符集。

UTF系列編碼

正是由於Unicode字符集較於ASK碼字符集,在很多字符標識的時候存在很大的空間浪費,我能用8位表示,你偏偏要用16位表示。很多時候數據需要在互聯網上進行傳輸的,這樣的化就會帶來很大的網絡帶寬的浪費,爲了減少浪費,提高網絡利用率,出現了一些中間格式的字符集,被稱爲統一的轉換格式(Unicode Transformation format),即UTF編碼。UTF是Unicode字符集的編碼方式

UTF-16編碼

UTF-16比較好理解就是任何字符都用兩個字節來保存。此時常常將Unicode和UTF-16等同對待。
UTF-16編碼效率最高,字符到字節相互轉換更簡單,進行字符串操作也更好,適合本地內存和磁盤之間使用,可以進行字符和字節的快速轉換。但是不適合做網絡傳輸使用。

UTF-8編碼

文件在網絡中傳輸是以bit流的形式展開的,如果採用UTF-16編碼的數據,接收的時候每16位一切就是一個字符;UTF-8編碼是可變字節編碼,文本數據讀取是一個字節一個字節來讀取的,然後根據字節開頭的bit標識來識別,然後確定幾個字節是一個字符單元。

UTF-8可變字節編碼

UTF-8字符集中,原Unicode字符編號從0到127,前128個字符是單字節編碼,編號在128至2047的是雙字節編碼(2的11次方),編號在2048之後就是三字節編碼

切分字符以後怎樣識別可變,三種情況分別爲:

  • 一個字節代表一個字符:第一個字節前1個bit位爲0,說明一個字節代表一個字符。
  • 兩個字節代表一個字符:第一個字節的前3個bit位是110,第二個字節前2個bit位是10,說明兩個字節代表一個字符。
  • 三個字節代表一個字符:第一個字節的前四位是1110,第二個字節的前2位是10,第三個字節的前2位是10,說明三個字節代表一個字符。
    在這裏插入圖片描述

UTF-8文件中,ASKⅡ碼佔用一個字節,中文佔三個字節長度,相比較UTF-16,更適合網絡傳輸,節省傳輸流量大小。

###UTF-8文件的解碼過程
有個一個UTF-8編碼的文件,文件內容如下:
“aá一”
分別是英文字母"a", 法語字母"à", 漢字"一"

第1步獲取16進制編碼
61 C3 A9 E4 B8 80

第2步轉換爲二進制編碼:
01100001
11000011
10100001
11100100
10111000
10000000
此時能看出該文本共有六個字節。到底哪個字節是一個字符單元呢?

第3步根據UTF-8編碼規則將字節分組:
01100001

11000011
10100001

11100100
10111000
10000000

第4步重新計算,得出對應的Unicode字符集的二進制編碼:
00000000 01100001
00000000 11100001
01001110 00000000

計算規則是,去除二進制位的標紅標誌位,然後合併到一起,合併成一個16位二進制數。如果不足16位,高位用0補齊

第5步計算機從Unicode字符集中,利用二進制對應的編號反查出字符爲:
a
á

二進制編號轉成十進制字符編號爲:
97
225
19968

在html中文件利用html實體可以查出來字符
aá&19968;
輸出:aá一

在UTF8中空格是佔三個字節,十進制編號爲65279
在UTF16中空格是佔兩個字節,十進制編號爲65534

結語

雖然一個漢字在UTF-8編碼中佔三個字節編碼,但是計算機Unicode字符集中字符編號是一個雙字節編碼,這是計算機在反查之前,將UTF-8三個字節,每8位去除了標識位,然後拼接重組形成Unicode 16位二進制字符編號。有了這個雙字節字符編號就可以去Unicode字符集反查相應的字符了。字符編號由UTF-8編碼,轉成了Unicode編碼。

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