從ASCII碼->Unicode->UTF-8歷史變遷,及其差異

2021-01-07 strongerHuang

關注、星標公眾號,不錯過精彩內容

說到ASCII,Unicode和UTF-8,可能大家都知道是字符編碼,但具體含義,以及其中差異,可能很多人都不知道。

一、名稱解釋

ASCII:American Standard Code for InformationInterchange,美國信息互換標準代碼。

Unicode:統一碼、萬國碼、單一碼,是計算機科學領域裡的一項業界標準,包括字符集、編碼方案等。

UTF-8:8-bit Unicode Transformation Format,是一種針對Unicode的可變長度字符編碼。

二、歷史變遷

先給大家看一張變遷圖:

很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為「字節」。再後來,他們又做了一些可以處理這些字節的機器,機器開動了,可以用字節來組合出很多狀態,狀態開始變來變去。他們看到這樣是好的,於是它們就這機器稱為」計算機「。

開始計算機只在美國使用,八位的字節一共可以組合出256種不同的狀態。他們把其中的編號從0開始的32種狀態分別規定了特殊的用途,一但終端、印表機遇上約定好的這些字節被傳過來時,就要做一些約定的動作。遇上0×10, 終端就換行,遇上0×07, 終端就向人們嘟嘟叫。他們看到這樣很好,於是就把這些0×20以下的字節狀態稱為「控制碼」。他們又把所有的空格、標點符號、數字、大小寫字母分別用連續的字節狀態表示,一直編到了第127號,這樣計算機就可以用不同字節來存儲英語的文字了。大家看到這樣,都感覺很好,於是大家都把這個方案叫做 ANSI 。

後來,世界各地都開始使用計算機了,但是很多國家用的不是英文,他們的字母裡有許多是ASCII裡沒有的,為了可以在計算機 保存他們的文字,他們決定採用 127號之後的空位來表示這些新的字母、符號,還加入了很多畫表格時需要用下到的橫線、豎線、交叉等形狀,一直把序號編到了最後一個狀態255。從128 到255這一頁的字符集被稱「擴展字符集」。

等中國人們得到計算機時,已經沒有可以利用的字節狀態來表示漢字,而且常用漢字有六七千個,這個時候,中國人民就使用了一套漢字方案叫做GB2312」。隨著發展,又發現了一些局限,所以就有了GBK,再繼續往後增加了一些字符(如少數名族字體),GBK擴成了 GB18030。

因為當時各個國家都像中國這樣搞出一套自己的編碼標準,結果互相之間誰也不懂誰的編碼,誰也不支持別人的編碼,連大陸和臺灣這樣只相隔了150海裡也使用不同編碼。這個時候,出現了一個叫 ISO 組織(國際標準化組織)決定著手解決這個問題。他們採用的方法很簡單:廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號 的編碼!他們打算叫它「Universal Multiple-Octet Coded Character Set」,簡稱 UCS, 俗稱 「Unicode」。

但是Unicode同樣也有2個問題:

1.計算機怎麼知道二個字節為一個字符,如何識別二個字節為什麼一個字符?

2.針對英文字符,如果使用大於1個字節來表示,那麼低位的前面幾個字節全是0。很奢侈浪費空間,因為現在計算機大部分內容還是英文。

unicode在很長一段時間內無法推廣,直到網際網路的出現,為解決unicode如何在網絡上傳輸的問題,於是面向傳輸的眾多 UTF(UCS Transfer Format)標準出現了。顧名思義,UTF-8就是每次8個位傳輸數據,而UTF-16就是每次16個位。UTF-8就是在網際網路上使用最廣的一種unicode的實現方式,這是為傳輸而設計的編碼,並使編碼無國界,這樣就可以顯示全世界上所有文化的字符了。

三、Charset and Encoding

1.什麼是字符編碼

Charset (Character set) 字符集:是對字符抽象表示的集合。包括世界上各種文字、符合和字符。

字符集只是一個規則集合的名字,對應到真實生活中,字符集就是對某種語言的稱呼。例如:英語,漢語,日語。

2.什麼是字符編碼

對於一個字符集來說要正確編碼轉碼一個字符需要三個關鍵元素:字庫表(character repertoire)、編碼字符集(coded character set)、字符編碼(character encoding)。

字庫表是一個相當於所有可讀或者可顯示字符的資料庫。字庫表決定了整個字符集能夠展現表示的所有字符的範圍。

編碼字符集,即用一個編碼值code point來表示一個字符在字庫中的位置。

字符編碼,將編碼字符集和實際存儲數值之間的轉換關係。

四、UTF-8和Unicode的關係

看完上面兩個概念解釋,相信你應該明白其中關係了。Unicode就是上文中提到的編碼字符集,而UTF-8就是字符編碼,即Unicode規則字庫的一種實現形式。隨著網際網路的發展,對同一字庫集的要求越來越迫切,Unicode標準也就自然而然的出現。它幾乎涵蓋了各個國家語言可能出現的符號和文字,並將為他們編號。

五、進一步理解UTF-8編碼

UTF-8編碼為變長編碼。最小編碼單位(code unit)為一個字節。一個字節的前1-3個bit為描述性部分,後面為實際序號部分。

1.如果一個字節的第一位為0,那麼代表當前字符為單字節字符,佔用一個字節的空間。0之後的所有部分(7個bit)代表在Unicode中的序號。

2.如果一個字節以110開頭,那麼代表當前字符為雙字節字符,佔用2個字節的空間。110之後的所有部分(5個bit)加上後一個字節的除10外的部分(6個bit)代表在Unicode中的序號。且第二個字節以10開頭。

3.如果一個字節以1110開頭,那麼代表當前字符為三字節字符,佔用3個字節的空間。110之後的所有部分(5個bit)加上後兩個字節的除10外的部分(12個bit)代表在Unicode中的序號。且第二、第三個字節以10開頭。

來看一個UTF-8編碼例子:

發現其中規律:

1個字節的UTF-8十六進位編碼是以比8小的數字開頭的

2個字節的UTF-8十六進位編碼是以C或D開頭的

3個字節的UTF-8十六進位編碼是以E開頭的

本文就寫到這裡,希望對你有幫助。當然,更多關於字符編碼的內容,感興趣朋友可以自行了解。

END

相關焦點

  • Unicode和UTF-8
    thanksandhttps://anaconda.org>>> import sys>>> sys.getdefaultencoding()'ascii我這樣理解它,比如Java語言某些數據類型使用UTF-16編碼,Python2默認使用ASCII編碼(當然你可以在程序開頭寫"# -*- coding: utf-8 —"表明用UTF-8編碼),Python3默認使用UTF-8編碼,Ubuntu默認使用UTF-8編碼,Win7中文版默認使用GBK編碼(在GB2312上面的拓展版本),在這些系統或應用中定義同一個字符,儘管長度不一,但字符的Unicode
  • Python 與 Unicode
    unicode 與 utf8 的關係unicode 定義了統一的字符集, UTF8 則是一種編碼 unicode 字符集的方式.在 python2 中, str 類型, unicode 類型都是 basestring 的子類, 其中 str 類型就好比 C 語言中的字符串, unicode 類型就好比 C 語言中的寬字符串.因為 utf8 的編碼方式不使用 0x0 填充, 一串 utf8 字符流實際上也是一串合法的 c 字符流 (0x0 結尾) — 也就是合法的 str 類型的字符流.
  • ascii編碼與unicode編碼
    因此,unicode編碼應運而生。unicode編碼在內存中佔兩個字節,最多可表示 65535 個字,可以把所有語言都統一到一套編碼裡,這樣就解決了亂碼問題。    通過調試結果也可以看出,字節值為正數,用 ascii 編碼表示英文;字節值負數,用 unicode 編碼表示中文。
  • 字符編碼那些事:Unicode與UTF-8(見過但沒懂過,說的就是你)
    對於英語文本,UTF-8碼只佔用一個字節,字節的第一位設為0,和ASCII碼完全相同對於其他,n個字節的字符(n>1),第一個字節的前n位設為1,第n+1位設為0,後面字節的前兩位都設為10,這n個字節的其餘空位填充該字符unicode碼,高位用0補足。
  • Python(33)常用指引:Unicode 指南
    , 'unicode rocks!'UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte>>> b'\x80abc'.decode("utf-8", "replace")'\ufffdabc'>>> b'\x80abc'.decode
  • 運維開發:字符集編碼 ASCII,Unicode 和 UTF-8 你知多少
    本篇文章介紹了ASCII,Unicode 和 UTF-8編碼的問題和轉換還有實例分析。開始閱讀文章吧一、ASCII 碼我們知道,計算機內部,所有信息最終都是一個二進位值。每一個二進位位(bit)有0和1兩種狀態,因此八個二進位位就可以組合出256種狀態,這被稱為一個字節(byte)。
  • bcd碼和ascii碼的區別
    BCD碼   二進位編碼的十進位數,簡稱BCD碼(Binarycoded Decimal)。 這種方法是用4位二進位碼的組合代表十進位數的0,1,2,3,4,5,6 ,7,8,9 十個數符。4位二進位數碼有16種組合,原則上可任選其中的10種作為代碼,分別代表十進位中的0,1,2,3,4,5,6,7,8,9 這十個數符。
  • 不要再問Python 2和Python 3的Unicode問題啦!
    f.write(name.encode('utf-8'))... >>> with open('./Desktop/data.txt', 'r') as f:...    data = f.read()...
  • 【Python進階】2.9將Unicode文本標準化
    為了修正這個問題,你可以使用unicodedata模塊先將文本標準化:>>> import unicodedata>>> t1 = unicodedata.normalize('NFC', s1)>>> t2 = unicodedata.normalize('NFC', s2)>>>
  • C++中字符編碼的轉換(Unicode、UTF-8、ANSI)
    ANSI也叫本地碼。我們要做到能在Unicode、UTF-8、ANSI這三種編碼格式中自由轉換。如下圖所示:在C++中,要怎麼做呢?std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv; ret = wcv.to_bytes(wstr); } catch (const std::exception & e) { std::cerr << e.what() << std::endl;
  • ASCII、ANSI、GB2312、GBK、UNICODE、UTF-8 五種編碼的簡介
    對於中文簡體電腦系統中,咱們國家標準總局發布了 GB2312 ,即擴展了 ASCII 碼,最後出現了 GB2312、GBK 等,GB2312 是簡體中文的碼,GBK:支持簡體中文及繁體中文、兼容 GB2312 編碼,BIG5 是支持繁體中文。
  • Unicode與UTF-8的區別
    為了保持與ASCII碼的兼容性,一般最高為為0時和原來的ASCII碼相同,最高位為1的時候,各個國家自己給後面的位(1xxx xxxx)賦予他們國家的字符意義。3、UTF-8 UTF-8就是使用變長字節表示,顧名思義,就是使用的字節數可變,這個變化是根據Unicode編號的大小有關,編號小的使用的字節就少,編號大的使用的字節就多。使用的字節個數從1到4個不等。