1.工具
前面講過,隨着計算機發展到世界各地,因而各個國家和地區各自爲政,搞出了不少既兼容ASCII但又互相不兼容的各類編碼方案。這樣一來同一個二進制編碼就有可能被解釋成不一樣的字符,致使不一樣的字符集在交換數據時帶來極大的不便。編碼
好比大陸和臺灣是隻相隔150海里、使用着同一種語言的兄弟地區,也分別採用了不一樣的DBCS雙字節字符集編碼方案。spa
之前大陸地區必須裝上相似於「UCDOS但願漢字系統」這樣的中文處理系統專門來處理簡體漢字的顯示、輸入問題。操作系統
而臺灣地區因爲採用BIG5編碼方案(統一繁體字編碼,俗稱大五碼,使用2個字節表示繁體漢字),則必須安裝相似於「ET倚天漢字系統」這樣的繁體中文處理系統才能夠正確顯示、輸入繁體漢字。翻譯
所以,要想打開一個文本文件,就必須首先知道它所採用的編碼方案,不然用錯誤的編碼方案進行解碼,就會出現亂碼。爲何電子郵件經常出現亂碼?就是由於發信人和收信人使用的編碼方案不同。設計
2.3d
想象一下,若是有一種統一的編碼方案,將世界上全部語言字符都歸入其中,每個字符都給予一個全球獨一無二的編碼,那麼亂碼問題就會消失。因而,全球全部國家和民族使用的全部語言字符的統一編碼方案誕生了。代理
最初,由多語言軟件製造商組成了統一碼聯盟(The Unicode Consortium),而後於1991年發佈了The Unicode Standard(統一碼標準),定義了一個全球統一的通用字符集,習慣簡稱爲Unicode字符集(Unicode常被稱爲統一碼、萬國碼、單一碼,嚴格來講,這種稱呼不夠嚴謹或不夠準確,由於Unicode字符集只是一個編號字符集,還沒有通過字符編碼方式CEF和字符編碼模式CES進行編碼)。code
接着,ISO及IEC也於1993年聯合發佈了稱之爲Universal Multiple-Octet Coded Character Set(通用多八位組編號字符集,習慣翻譯爲「通用多八位編碼字符集」)、簡稱爲UCS(Universal Character Set通用字符集)、標準號爲ISO/IEC 10646-1的全球統一的通用字符集。htm
後來,統一碼聯盟與ISO/IEC雙方都意識到世界上沒有必要存在兩套全球統一的通用字符集,因而進行整合,併爲創立一個單一的全球統一的通用字符集而協同工做。到Unicode 2.0時,Unicode字符集和UCS字符集(ISO/IEC 10646-1)基本保持了一致。
雖然如今兩個項目仍都存在,並獨立地公佈各自的標準,但統一碼聯盟和ISO/IEC都贊成保持二者的通用字符集相互兼容,並共同調整將來的任何擴展。
目前,Unicode的知名度要比UCS知名度大得多,已成了全球統一的通用字符集或編碼方案的代名詞。而且在實踐中,Unicode也要比UCS應用得更爲普遍得多。
3.
Unicode字符集的目標是涵蓋目前人類使用的全部字符,併爲每一個字符分配惟一的字符編號(即碼點編號、碼點值),一一對應於編號空間(Code Space代碼空間、碼空間、碼點空間)裏的碼點(Code Point代碼點)。
Unicode字符集將全部字符按照使用上的頻繁度劃分爲17個平面(Plane層面),每一個平面上的編號空間有2^16=65536個碼點。
(笨笨阿林原創文章,轉載請註明出處)
4.
其中第0個平面BMP(Basic Multilingual Plane基本多語言平面、基本多文種平面、基本平面、平面0),基本涵蓋了當今世界上正在使用中的經常使用字符。咱們日常用到的Unicode字符,通常都是位於BMP平面上的。
BMP平面之外其餘的增補平面(也稱爲輔助平面)要麼用來表示一些很是特殊的字符(好比不經常使用的象形文字、遠古時期的文字等),且多半隻有專家在歷史和科學領域裏纔會用到它們;要麼被留做擴展之用。目前Unicode字符集中尚有大量編號空間未被使用。
另外,BMP平面有一個專用區(Private Use Zone):0xE000~0xF8FF(十進制57344~63743),共6400個碼點,被保留爲專用(私用),於是永遠不會被分配給任何字符;還有一個被稱爲代理區(Surrogate Zone)的特殊區域:0xD800-0xDFFF(十進制55296~57343),共2048個碼點,目的是用基本平面BMP中的兩個碼點「代理」表示BMP之外的其餘增補平面的字符(解釋詳見後文)。
5.
Unicode字符集的字符編碼方式一開始規定用兩個字節(即16位)來統一表示全部的字符(即UTF-16編碼方式,UTF-16編碼方式要早於UTF-8編碼方式、UTF-32編碼方式出現,詳見後文)。
對於ASCII字符,與前面介紹的ANSI編碼同樣,Unicode也保持其原編碼不變(準確地說,應該是保持其「編號不變」,由於在傳統字符編碼模型中,編號與編碼不做區分,說「編碼不變」也勉強能夠),只是在UTF-16字符編碼方式中將其長度由原來的8位擴展爲16位(注意,這裏的字符編碼方式CEF還只是邏輯意義上的碼元序列,不是字符編碼模式CES——物理意義上的字節序列),而其餘文化和語言的字符則所有從新統一編碼。
因爲ASCII字符只須要用到UTF-16的16位編碼中的低8位,因此其高8位永遠是0(實際上也只用到了低8位中的低7位,所以準確地說其高9位永遠是0)。
6.
在Unicode標準最初推出的UTF-16字符編碼方式中,不管是半角的英文字母,仍是全角的漢字,它們都表示統一的「一個字符」,同時其編碼也都是統一的「兩個字節」(也所以UTF-16屬於雙字節碼元編碼方式,而Unicode標準在UTF-16字符編碼方式以後所推出的UTF-8字符編碼方式則屬於單字節碼元編碼方式,二者之間的關係與區別詳見後文)。
請注意這裏的「字符」和「字節」兩個術語意義上的不一樣:「字節」是一個與計算機相關的物理意義上的8位存貯單元,而「字符」則是一個與文化相關的邏輯意義上的文字符號。
7.
在Unicode標準推出以前,那些作多語言國際軟件的公司趕上過很大麻煩。他們爲了在不一樣的國家銷售同一套軟件,就不得不特別注意字符編碼的問題。不只要到處當心不要搞錯,還要把軟件中的文字在不一樣的字符編碼中轉換來轉換去,而Unicode標準的出現,提供了一個很好的一攬子解決方案。
因而從Windows NT開始,微軟趁機把操做系統改了一遍,把全部的核心代碼都改爲了採用Unicode標準的版本(實際使用的就是Unicode標準的UTF-16字符編碼方式CEF所對應的UTF-16字符編碼模式CES)。
從Windows NT開始,Windows系統終於無須要加裝各類本土語言系統(好比「UCDOS但願漢字系統」之類的),就能夠直接顯示全世界上全部的字符了。固然,爲了保持兼容性,對於以前的ANSI編碼方案,Windows仍然是必須支持的。
(笨笨阿林原創文章,轉載請註明出處)
8.
Unicode在剛開始制訂UTF-16字符編碼時,並無考慮與任何一種現有的字符編碼保持徹底兼容(與ASCII也只能算是間接兼容或者說半兼容,畢竟ASCII字符的UTF-16編碼也一樣是16位的),好比GBK與Unicode在漢字的編碼上徹底是不同的,沒有任何一種簡單的算術方法能夠將文本內容在UTF-16編碼和GBK編碼之間進行直接轉換,要轉換的話只能經過查表這樣低效率的笨辦法一個字符對應一個字符地來進行。
即使是ASCII字符,也屬於不徹底兼容,由於UTF-16也是用兩個字節來表示的,雖然低7位與ASCII保持了一致,其他高位的9位均只是佔位的0,但畢竟仍是使用了16位共兩個字節編碼,不一樣於ASCII碼的單字節編碼。正是鑑於此(固然除此以外還有其餘緣由),因而後來又設計了UTF-8字符編碼方式,則保持了跟ASCII碼的徹底兼容。
9.
從字符集的角度上來說,Unicode字符集不一樣於ASCII這樣不能再增長字符的封閉字符集,而是一個開放的字符集,是能夠不斷增長字符的。所以Unicode字符集也在不斷髮展(好比隨着互聯網即時聊天工具的發展而流行起來的不少Emoji表情符就不斷地被增長到了Unicode字符集中),理論上支持的字符數量是沒有上限的,將來還可再擴展。
(注意,不少文章中,有時候稱字符集,有時候稱字符編碼方案,大體上來說,字符集與字符編碼方案常常被視爲同義詞,尤爲是在傳統字符編碼模型中。但若深究起來的話,在現代字符編碼模型中,因爲字符集實際上爲編號字符集的簡稱,所以字符編碼方案實際上涵蓋了字符集。具體可參看前面對於現代字符編碼模型的解釋。)
10.
另外,與Unicode字符集基本保持兼容的ISO/IEC UCS字符集分爲UCS-2(2-byte Universal Character Set)和UCS-4(4-byte Universal Character Set)兩部分,分別以2字節和4字節表示字符編號(即碼點編號)。
(注意,UCS-2和UCS-4只是表示字符編號的字節數不一樣,與字符編碼方式CEF中的2字節與4字節沒有關係,也所以不能分別等同於Unicode編碼方案中的UTF-16和UTF-32字符編碼方式CEF,有很多文章中稱二者等同,這是徹底錯誤的。事實上,由UCS-2和UCS-4所組成的UCS字符集跟Unicode字符集同樣,均可分別採用UTF-八、UTF-16和UTF-32字符編碼方式CEF對字符編號進行編碼。)
其中,UCS-2又被稱爲基本多語言平面BMP(Basic Multilingual Plane),與Unicode的基本多語言平面BMP保持了一致;而UCS-4格式用四個字節中的31位來表示一個字符的碼點編號(即字符編號),這樣可表示21億個不一樣的字符(2^31=2147483648;最高位爲0,另有用途)。
不過,實踐中UCS字符集應用得很少,基本以Unicode字符集爲主,所以不做詳細介紹。
11.
Unicode字符集不只給每一個字符根據其所在的碼點分配了一個惟一的碼點值(即碼點編號,不嚴格地來說,也勉強可認爲是字符編號,注意不要跟UTF-1六、UTF-8等字符編號的編碼方式混淆了概念),並且賦予了一個正式的名稱:在表示一個Unicode編號(或UCS編號)的十六進制數的前面加上「U+」。
好比,U+0041表示英語大寫字母A,U+4E25表示漢字「嚴」。具體的字符對應表,能夠查詢unicode.org,漢字也可查詢專門的中日韓漢字Unicode編碼表。
Unicode字符集中的U+0000~U+007F(即十進制的0~127)與ASCII字符集(即ISO/IEC 646標準)是一致的,U+0000~U+00FF(即十進制的0~255)與ISO/IEC 8859-1標準(Latin-1字符集)也是一致的。
(笨笨阿林原創文章,轉載請註明出處)
【預告:下一篇將重點講解另無數人頭大的字節序(大端序、小端序),敬請關注!】