每個開發人員都應知道的字符編碼知識

轉載請註明出處:葡萄城官網,葡萄城爲開發者提供專業的開發工具、解決方案和服務,賦能開發者。

部分原文出處:https://www.freecodecamp.org/news/everything-you-need-to-know-about-encoding/

這篇文章裏,我會向大家簡要的介紹編碼相關的歷史,同時還會通過介紹部分計算機科學理論的基礎來幫助更好的理解編碼知識。

編碼介紹及歷史

我們都知道計算機只能理解二進制數據暨0和1,二進制是計算機語言,這是因爲計算機在設計之初是由八個晶體管通過開合來表示數據的,於是這八位二進制數據被稱爲“字節”,一個字節根據八位的不同組合共有256種不同的結果。

在計算機啓用之初,由於只在美國本土使用,所以開發者通過256個編碼制定了ASCII標準,ASCII是將二進制字符對應到大小寫字母、數字和常用符號的映射關係表,表如下:

 

 

我們可以看到,這張表裏只用到了128就能完整表示出所有英語文字的方案了,而128-255位被定義爲了擴展字符集,留作日後用來擴展使用,例如用來表示如:邊框、圓角、西文等字符,以下是第一批IBM計算機使用的ASCII的128-255編碼映射關係。

 

 

但隨着計算機的不斷普及,國內和其他的一些國家也開始使用電腦,爲了能在計算機上使用自己的文字, 很多國家選擇在127-255擴展定義自己的文字。

我們國內也一樣擴展了自己的映射表,但我們的常用漢字數量還是遠遠大於這個閾值的儲存能力,於是我們定義在中文字符編碼格式下,兩個字節表示一個漢字。於是在當時各個國家都有自己一套獨特的擴展編碼標準,以至於導致計算機在當時顯示不同國家的字符時經常會出現亂碼。

類似下面這樣

 

 

Unicode的統一

互聯網是將世界各地計算機連接起來的途徑,如果能通過一套標準爲每種語言中的每個字符都設定統一且唯一對應的編碼,那麼世界上所有的文字都能正常顯示出來,而不用爲了顯示某種文字而頻繁切換codepage。

���當然���如果就是���想顯示֎֏0590成這樣׃ׅׄ׆ׇ除外֐��。

於是ISO國際組織於1994年正式推出了Unicode標準(又稱萬國碼、統一碼)。之所以能統一,是因爲Unicode規定了,所有字符統一由兩個字節來表示,也就是16位。原先的英文字符、數字和半角符號雖然原先在ASCII中只用8位就能表現,但需要擴充爲16位的話必須在高位補0, 如下示例:

1 – 00000001 – 00000000 00000001

可以看到,通過增長位數來擴展支持更多的語種這樣的方式很不錯,但在純英文環境下由於沒有用的補零高位會導致文本佔用大量的存儲空間,而這一情況在互聯網時代的到來變得更加明顯。

於是爲了解決英文Unicode在網絡傳輸時帶來的低效問題,UTF協議也隨之而來。

Unicode 轉換協議 (UTF)

UTF是我們對Unicode碼點進行編碼的一種方式。UTF編碼是由Unicode標準定義的,能夠對我們需要的每一個Unicode碼點進行編碼。

但是UTF標準有不同的類型。它們分爲UTF-8、UTF-16和UTF-32,而其中在互聯網中最常用的就是UTF-8,在HTML5中也被置頂位新文檔的默認編碼。

下圖中你可以看到,從2012年開始,UTF-8相較其他字符集的受歡迎度越來越高。

 

 

 

 

什麼是UTF-8,它的工作原理是什麼?

UTF-8是一種可變長的編碼方式,理論上可達6個字節,但已現行文字和符號看,4個字節是已經足夠了。

UTF-8以 8位(即 1個字節)爲單元對原始Unicode碼進行編碼,規定:多字節碼(2個字節以上)以轉換後第1個字節起頭的連續“1”的數目(這些連續“1”稱爲標記位),表示轉換成幾個字節:“110”連續兩個“1”,表示轉換結果爲2個字節,“1110”表示3個字節,而“11110”則表示4個字節……跟隨在標記位之後的“0”,其作用是分隔標記位和字符碼位。第2~第4個字節的起頭兩個位固定設置爲“10”,也作爲標記,剩下的6個位才做爲字符碼位使用。這樣,2字節UTF-8碼剩下11個字符碼位,可用以轉換0080~07FF的原始字符碼,3字節剩下16個字符碼位,可用以轉換0800~FFFF的原始字符碼,由此類推。編碼方式的模板如下:

1
2
3
4
5
6
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

  

編碼使用的位數取決於語言,一般來講,英文會被編碼爲1個字節,歐洲(拉丁),希伯來語和阿拉伯語用2個字節表示。中文,日文,韓文和其他亞洲字符使用3個字節。你可能發現了,原本爲了解決佔用過長的問題,但實際編碼後中文長度變爲了3字節,如果你的客戶都是國內用戶,使用GBK能部分提高網頁內文本的傳輸效率。

編碼聲明方式

看起來正確聲明編碼類型很重要,那麼,我們該如何指定編碼呢?

只需在<head>中的meta聲明使用的字符集即可,如下:

1
2
3
4
<html lang= "en" >
< head >
   <meta charset= "utf-8" >
< /head >

除了以上方式外,我們還可以從HTTP請求/響應的Content-Type表頭中聲明。

最後總結

以上就是關於編碼的一些簡單的介紹,除了列舉出的編碼外,還有很多其他更多類型的編碼,如果大家對其他的內容有補充,歡迎通過留言告訴我。  

 

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