字符編碼:計算機的巴別塔

首發於 字符編碼:計算機的巴別塔html

巴別塔:《聖經·舊約·創世記》第11章宣稱,當時人類聯合起來興建但願能通往天堂的高塔;爲了阻止人類的計劃,上帝讓人類說不一樣的語言,令人類相互之間不能溝通,計劃所以失敗,人類自此各散東西。此故事試圖爲世上出現不一樣語言和種族提供解釋。

咱們曾經在HTTP的響應頭中見到過Content-Type:text/html; charset=utf-8,也曾在HTML文件中見到過<meta charset="utf-8">。它們都是用於聲明字符編碼爲utf-8。那麼utf-8究竟是什麼?這要從計算機的起源提及。網絡

最先的計算機是機械式繼電器計算機,經過繼電器的開關狀態來表示0和1。後來的電子管計算機、晶體管計算機、集成電路計算機都繼承了這一設定,這也是爲何計算機以二進制來存儲數據。編碼

人類發明計算機的目的是處理數據,而絕大多數數據都是文本形式的,因此要把這些文本轉換爲計算機可識別的二進制數據,再把計算機處理過的二進制數據轉換爲人類可識別的文本。這個二進制和文本的對照表就是字符集。.net

ASCII

美國人發明了最先的現代計算機。因此美國人最初制定了ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)來保存控制碼、空格、標點符號、數字、大小寫字母。計算機的一個字節能夠組合出2^8種不一樣的狀態。 ASCII使用了128個狀態。code

編號從0開始的32種狀態分別規定了特殊的用途,這些0×20如下的字節狀態稱爲」控制碼」。

隨着世界各地的不一樣國家開始使用計算機,爲了能夠在計算機中使用ASCII中沒有制定的文字,在128至255號以後的狀態來表示這些新的字母、符號。這些字符集被稱「擴展字符集」。orm

GB23十二、GBK和BIG5

ASCII中是沒有漢字的,而經常使用簡體漢字就有幾千個。因此中國製定了GB2312(GB是國標的拼音縮寫)。GB2312規定:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一塊兒時,就表示一個漢字。GB2312收錄了6763個經常使用漢字。這也是爲何在之前一個漢字算兩個英文字符的緣由。htm

可是漢字有那麼多,GB2312中並不包含生僻字,因此仍是須要擴展。擴展以後的編碼方案被稱爲GBK標準,GBK包括了GB2312的全部內容,同時又增長了近20000個新的漢字(包括繁體字)和符號。繼承

當時同文同種的港臺同胞們也制定一套編碼標準BIG5,這套標準和GB2312/GBK並不兼容。而世界各地其餘國家也制定了本身的標準。雖然本地使用沒有問題,然而在網絡中因爲字符集不兼容,你們誰也看不懂別人的編碼,互相訪問就會出現亂碼。咱們彷彿進入了巴別塔被摧毀後的世界。ip

unicode

爲解決這個問題,ISO(國際標誰化組織)制定了通用字符集:「Universal Multiple-Octet Coded Character Set」,簡稱UCS,又稱unicodeutf-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的出現。UTF-8(8-bit Unicode Transformation Format)是一種針對unicode的可變長度字符編碼。它能夠用來表示unicode標準中的任何字符,且其編碼中的第一個字節仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須作少部份修改,便可繼續使用。所以,它逐漸成爲電子郵件、網頁及其餘存儲或傳送文字的應用中優先採用的編碼。互聯網工程工做小組(IETF)要求全部互聯網協議都必須支持UTF-8編碼。

UTF-8使用一至四個字節爲每一個字符編碼:

unicode是字符集, UTF-8是這一字符集的編碼方式。
  • 單字節的字符,字節的第一位設爲0,對於英語文本,UTF-8碼只佔用一個字節,和ASCII碼徹底相同;
  • n個字節的字符(n>1),第一個字節的前n位設爲1,第n+1位設爲0,後面字節的前兩位都設爲10,這n個字節的其他空位填充該字符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創建了計算機世界的巴別塔。
相關文章
相關標籤/搜索