首發於 字符編碼:計算機的巴別塔html
巴別塔:《聖經·舊約·創世記》第11章宣稱,當時人類聯合起來興建但願能通往天堂的高塔;爲了阻止人類的計劃,上帝讓人類說不一樣的語言,令人類相互之間不能溝通,計劃所以失敗,人類自此各散東西。此故事試圖爲世上出現不一樣語言和種族提供解釋。
咱們曾經在HTTP
的響應頭中見到過Content-Type:text/html; charset=utf-8
,也曾在HTML
文件中見到過<meta charset="utf-8">
。它們都是用於聲明字符編碼爲utf-8
。那麼utf-8
究竟是什麼?這要從計算機的起源提及。網絡
最先的計算機是機械式繼電器計算機,經過繼電器的開關狀態來表示0和1。後來的電子管計算機、晶體管計算機、集成電路計算機都繼承了這一設定,這也是爲何計算機以二進制來存儲數據。編碼
人類發明計算機的目的是處理數據,而絕大多數數據都是文本形式的,因此要把這些文本轉換爲計算機可識別的二進制數據,再把計算機處理過的二進制數據轉換爲人類可識別的文本。這個二進制和文本的對照表就是字符集。.net
美國人發明了最先的現代計算機。因此美國人最初制定了ASCII
(American Standard Code for Information Interchange,美國信息互換標準代碼)來保存控制碼、空格、標點符號、數字、大小寫字母。計算機的一個字節能夠組合出2^8種不一樣的狀態。 ASCII
使用了128個狀態。code
編號從0開始的32種狀態分別規定了特殊的用途,這些0×20如下的字節狀態稱爲」控制碼」。
隨着世界各地的不一樣國家開始使用計算機,爲了能夠在計算機中使用ASCII
中沒有制定的文字,在128至255號以後的狀態來表示這些新的字母、符號。這些字符集被稱「擴展字符集」。orm
ASCII
中是沒有漢字的,而經常使用簡體漢字就有幾千個。因此中國製定了GB2312
(GB是國標的拼音縮寫)。GB2312
規定:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一塊兒時,就表示一個漢字。GB2312
收錄了6763個經常使用漢字。這也是爲何在之前一個漢字算兩個英文字符的緣由。htm
可是漢字有那麼多,GB2312
中並不包含生僻字,因此仍是須要擴展。擴展以後的編碼方案被稱爲GBK
標準,GBK
包括了GB2312
的全部內容,同時又增長了近20000個新的漢字(包括繁體字)和符號。繼承
當時同文同種的港臺同胞們也制定一套編碼標準BIG5
,這套標準和GB2312/GBK
並不兼容。而世界各地其餘國家也制定了本身的標準。雖然本地使用沒有問題,然而在網絡中因爲字符集不兼容,你們誰也看不懂別人的編碼,互相訪問就會出現亂碼。咱們彷彿進入了巴別塔被摧毀後的世界。ip
爲解決這個問題,ISO
(國際標誰化組織)制定了通用字符集:「Universal Multiple-Octet Coded Character Set」,簡稱UCS
,又稱unicode
。utf-8
ISO
規定必須用4個字節來統一表示全部的字符,對於ASCII
裏的那些「半角」字符,unicode
包持其原編碼不變,只是將其長度由原來的8位擴展爲32位,高位所有置爲0,而其餘語言的字符則所有從新統一編碼。這個字符集的編碼方式稱爲UTF-32
(32-bit UCS Transfer Format)。
有2^32個狀態的unicode
之後會不會也不夠用?之前咱們還以爲IPv4
的地址用不完呢。但人類之因此偉大,緣由之一就在於咱們可以經過無窮的創造力解決各類問題。
若是按照unicode
規定,每一個符號用4個字節表示,那麼文本文件的大小會所以大出二三倍,在存儲和傳輸上就會很浪費。這也是unicode
在很長一段時間內沒法推廣的緣由。
直到UTF-8
的出現。UTF-8
(8-bit Unicode Transformation Format)是一種針對unicode
的可變長度字符編碼。它能夠用來表示unicode
標準中的任何字符,且其編碼中的第一個字節仍與ASCII
兼容,這使得原來處理ASCII
字符的軟件無須或只須作少部份修改,便可繼續使用。所以,它逐漸成爲電子郵件、網頁及其餘存儲或傳送文字的應用中優先採用的編碼。互聯網工程工做小組(IETF)要求全部互聯網協議都必須支持UTF-8
編碼。
UTF-8使用一至四個字節爲每一個字符編碼:
unicode
是字符集,UTF-8
是這一字符集的編碼方式。
UTF-8
碼只佔用一個字節,和ASCII
碼徹底相同;unicode
碼,高位用0補足。這樣就造成了以下的UTF-8
標記位:
- 0xxxxxxx - 110xxxxx 10xxxxxx - 1110xxxx 10xxxxxx 10xxxxxx - 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
最終,人類經過
unicode
創建了計算機世界的巴別塔。