二進制與字符編碼

進制

進制也就是進位制,是人們規定的一種進位方法。 對於任何一種進制---X進制,就表示某一位置上的數運算時是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。編程

二進制是計算技術中普遍採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數爲2,進位規則是「逢二進一」,借位規則是「借一當二」,由18世紀德國數理哲學大師萊布尼茲發現。當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。計算機中的二進制則是一個很是微小的開關,用「開」來表示1,「關」來表示0。windows

20世紀被稱做第三次科技革命的重要標誌之一的計算機的發明與應用,由於數字計算機只能識別和處理由‘0’.‘1’符號串組成的代碼。其運算模式正是二進制。19世紀愛爾蘭邏輯學家喬治布爾對邏輯命題的思考過程轉化爲對符號"0''.''1''的某種代數演算,二進制是逢2進位的進位制。0、1是基本算符。由於它只使用0、1兩個數字符號,很是簡單方便,易於用電子方式實現。瀏覽器

 

十進制:  逢十進一              表示數字: 0123456789網絡

二進制:逢二進一                表示數字: 0 1 編程語言

八進制: 逢八進一               表示數字: 01234567工具

做用: 在某些編程語言裏提供了使用八進制符號來表示數字的能力,並且仍是有一些比較古老的Unix應用在使用八進制。和二進制之間的轉換: 2-->8 :  取三合一     8-->2 : 取一分三性能

十六進制: 逢十六進一         表示數字: 01234567ABCDEF 優化

 

字符編碼

 

字符編碼(英語:Character encoding)也稱字集碼,是把字符集中的字符編碼爲指定集合中某一對象(例如:比特模式、天然數序列、8位組或者電脈衝),以便文本在計算機中存儲和經過通訊網絡的傳遞。常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII。其中,ASCII將字母、數字和其它符號編號,並用7比特的二進制來表示這個整數。一般會額外使用一個擴充的比特,以便於以1個字節的方式存儲。ui

在計算機技術發展的早期,如ASCII(1963年)和EBCDIC(1964年)這樣的字符集逐漸成爲標準。但這些字符集的侷限很快就變得明顯,因而人們開發了許多方法來擴展它們。對於支持包括東亞CJK字符家族在內的寫做系統的要求能支持更大量的字符,而且須要一種系統而不是臨時的方法實現這些字符的編碼。編碼

ASCII

美國(國家)信息交換標準(代)碼,一種使用7個或8個二進制位進行編碼的方案,最多能夠給256個字符

ASCII(包括字母、數字、標點符號、控制字符及其餘符號)分配(或指定)數值。

ASCII碼於1961年提出,用於在不一樣計算機硬件和軟件系統中實現數據傳輸標準化,在大多數的小型機和所有的我的計算機都使用此碼。ASCII碼劃分爲兩個集合:128個字符的標準ASCII碼和附加的128個字符的擴充和ASCII碼。比較EBCDIC。其中95個字符能夠顯示。另外33個不能夠顯示。 標準ASCII碼爲7位,擴充爲8位。

目前使用最普遍的西文字符集及其編碼是 ASCII 字符集和 ASCII 碼( ASCII 是 American Standard Code for Information Interchange 的縮寫),它同時也被國際標準化組織( International Organization for Standardization, ISO )批准爲國際標準。

基本的 ASCII 字符集共有 128 個字符,其中有 96 個可打印字符,包括經常使用的字母、數字、標點符號等,另外還有 32 個控制字符。標準 ASCII 碼使用 7 個二進位對字符進行編碼,對應的 ISO 標準爲 ISO646 標準。下表展現了基本 ASCII 字符集及其編碼:

字母和數字的 ASCII 碼的記憶是很是簡單的。咱們只要記住了一個字母或數字的 ASCII 碼(例如記住 A 爲 65 , 0 的 ASCII 碼爲 48 ),知道相應的大小寫字母之間差 32 ,就能夠推算出其他字母、數字的 ASCII 碼。

雖然標準 ASCII 碼是 7 位編碼,但因爲計算機基本處理單位爲字節( 1byte = 8bit ),因此通常仍以一個字節來存放一個 ASCII 字符。每個字節中多餘出來的一位(最高位)在計算機內部一般保持爲 0 (在數據傳輸時可用做奇偶校驗位)。

因爲標準 ASCII 字符集字符數目有限,在實際應用中每每沒法知足要求。爲此,國際標準化組織又制定了 ISO2022 標準,它規定了在保持與 ISO646 兼容的前提下將 ASCII 字符集擴充爲 8 位代碼的統一方法。 ISO 陸續制定了一批適用於不一樣地區的擴充 ASCII 字符集,每種擴充 ASCII 字符集分別能夠擴充 128 個字符,這些擴充字符的編碼均爲高位爲 1 的 8 位代碼(即十進制數 128~255 ),稱爲擴展 ASCII 碼。

經過了解字符的存儲編碼,能夠解決不少由編碼不匹配引發的問題,好比網頁亂碼、郵件亂碼,本文簡單扼要地闡明瞭ASCII編碼、EBCDIC編碼、GB2312編碼、Unicode編碼、UTF-8編碼、以及Base64編碼。

編碼

這套編碼叫ASCII(美國(國家)信息交換標準(代)碼),使用7個或8個二進制位進行編碼的方案,最多能夠給256個字符。使用了ASCII碼,不一樣的計算機之間就能夠實現數據的標準化。
可是ASCII使用的時候有一些限制。他最多之能夠表示256個字符。若是有其餘的字符就無能爲力了。ASCII只能表示26個基本的拉丁字母、阿拉伯數字和英式標點。所以也只能用於顯示現代美國英語。
後來計算機世界開始有了其餘語言,ASCII碼已經沒法知足需求。後來不一樣語言的人各自爲本身定製了一套屬於本身的編碼,同時與ASCII保持兼容。這些編碼統稱MBCS,到了這裏你們都開始好似用雙字節。(中國的叫GB*,好比GBK).
在後來有人開始以爲,這麼多編碼,有些編碼之間還不兼容,太讓人頭大了,因而有這麼一羣人就坐在一塊兒想出了一個辦法:全部的語言都使用同一種編碼,這種編碼就是Unicode。 Unicode使用最少2個字節(1個字節=1BYTE=8bit=一個長度爲8的二進制數) 來表示字母和符號等,有時候是4個字節。這樣就解決了上面遇到的問題。
Unicode又叫萬國碼,是業界的一種標準。可是有人又以爲若是我要表示一個ASCII裏的字符,使用unicode來表示不是太浪費空間了嗎,因而就有人想出了另一種解決方案——UTF-8。
UTF-8是對Unicode編碼的壓縮和優化,最大的特色是它採用了變長的編碼方式,他再也不是最少使用2個字節,而是將全部的字符進行分類。ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存…

GB2312是1980年國家制定的漢字內碼規範,收錄了6千多漢字及符號,表示的符號有限 ;國家標準化委員會又制定了GB13000,GB13000制定的原則與GB2312不一樣,GB13000以國際化爲目標, 該標準編碼參照了Unicode 2.0 標準編碼,與GB2312徹底不兼容,因早期的計算機中的漢卡採用了GB2312,沒法順利向GB13000過渡,因此GB13000變成了一個紙面上的 標準,沒法推廣-;有了這個經驗以後,國家標準化委員會制定了GBK標準,他兼容GB2312標準,同時在GB2312標準的基礎上擴展了GB13000包含的字。

MBCS

爲了擴充ASCII編碼,以用於顯示本國的語言,不一樣的國家和地區制定了不一樣的標準,由此產生了 GB2312, BIG5, JIS 等各自的編碼標準。這些使用 2 個字節來表明一個字符的各類漢字延伸編碼方式,稱爲 ANSI 編碼,又稱爲"MBCS(Muilti-Bytes Charecter Set,多字節字符集)"。在簡體中文系統下,ANSI 編碼表明 GB2312 編碼,在日文操做系統下,ANSI 編碼表明 JIS 編碼,因此在中文 windows下要轉碼成gb2312,gbk只須要把文本保存爲ANSI 編碼便可。 不一樣 ANSI 編碼之間互不兼容,當信息在國際間交流時,沒法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。一個很大的缺點是,同一個編碼值,在不一樣的編碼體系裏表明着不一樣的字。這樣就容易形成混亂。致使了unicode碼的誕生。

其中每一個語言下的ANSI編碼,都有一套一對一的編碼轉換器,Unicode變成全部編碼轉換的中間介質。全部的編碼都有一個轉換器能夠轉換到Unicode,而Unicode也能夠轉換到其餘全部的編碼。

GB2312

GB2312 也是ANSI編碼裏的一種,對ANSI編碼最初始的ASCII編碼進行擴充,爲了知足國內在計算機中使用漢字的須要,中國國家標準總局發佈了一系列的漢字字符集國家標準編碼,統稱爲GB碼,或國標碼。其中最有影響的是於1980年發佈的《信息交換用漢字編碼字符集 基本集》,標準號爲GB 2312-1980,因其使用很是廣泛,也常被通稱爲國標碼。GB2312編碼通行於我國內地;新加坡等地也採用此編碼。幾乎全部的中文系統和國際化的軟件都支持GB 2312。

GB2312是一個簡體中文字符集,由6763個經常使用漢字和682個全角的非漢字字符組成。其中漢字根據使用的頻率分爲兩級。一級漢字3755個,二級漢字3008個。因爲字符數量比較大,GB2312採用了二維矩陣編碼法對全部字符進行編碼。首先構造一個94行94列的方陣,對每一行稱爲一個「區」,每一列稱爲一個「位」,而後將全部字符依照下表的規律填寫到方陣中。這樣全部的字符在方陣中都有一個惟一的位置,這個位置能夠用區號、位號合成表示,稱爲字符的區位碼。如第一個漢字「啊」出如今第16區的第1位上,其區位碼爲1601。由於區位碼同字符的位置是徹底對應的,所以區位碼同字符之間也是一一對應的。這樣全部的字符均可經過其區位碼轉換爲數字編碼信息。

GB2312字符在計算機中存儲是以其區位碼爲基礎的,其中漢字的區碼和位碼分別佔一個存儲單元,每一個漢字佔兩個存儲單元。因爲區碼和位碼的取值範圍都是在1-94之間,這樣的範圍同西文的存儲表示衝突。例如漢字‘珀’在GB2312中的區位碼爲7174,其兩字節表示形式爲71,74;而兩個西文字符‘GJ’的存儲碼也是71,74。這種衝突將致使在解釋編碼時到底表示的是一個漢字仍是兩個西文字符將沒法判斷。

爲避免同西文的存儲發生衝突,GB2312字符在進行存儲時,經過將原來的每一個字節第8bit設置爲1同西文加以區別,若是第8bit爲0,則表示西文字符,不然表示GB2312中的字符。實際存儲時,採用了將區位碼的每一個字節分別加上A0H(160)的方法轉換爲存儲碼,計算機存儲規則是此編碼的補碼,並且是位碼在前,區碼在後。

GB2312編碼用兩個字節(8位2進制)表示一個漢字,因此理論上最多能夠表示256×256=65536個漢字。但這種編碼方式也僅僅在中國行得通,若是您的網頁使用的GB2312編碼,那麼不少外國人在瀏覽你的網頁時就可能沒法正常顯示,由於其瀏覽器不支持GB2312編碼。固然,中國人在瀏覽外國網頁(好比日文)時,也會出現亂碼或沒法打開的狀況,由於咱們的瀏覽器沒有安裝日文的編碼表。

GBK

GBK即漢字內碼擴展規範,K爲擴展的漢語拼音中「擴」字的聲母。英文全稱Chinese Internal Code Specification。GBK編碼標準兼容GB2312,共收錄漢字21003個、符號883個,並提供1894個造字碼位,簡、繁體字融於一庫。GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集——基本集》,1980年由國家標準總局發佈。基本集共收入漢字6763個和非漢字圖形字符682個,通行於中國大陸。新加坡等地也使用此編碼。GBK是對GB2312-80的擴展,也就是CP936字碼表 (Code Page 936)的擴展(以前CP936和GB 2312-80如出一轍)。

GB 2312的出現,基本知足了漢字的計算機處理須要,但對於人名、古漢語等方面出現的罕用字,GB 2312不能處理,這致使了後來GBK及GB 18030漢字字符集的出現。

GBK採用雙字節表示,整體編碼範圍爲8140-FEFE,首字節在81-FE 之間,尾字節在40-FE 之間,剔除 xx7F一條線。總計23940 個碼位,共收入21886個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號883 個。P-Windows3.2和蘋果OS以GB2312爲基本漢字編碼, Windows 95/98則以GBK爲基本漢字編碼。

有些漢字用五筆和拼音都打不出來,如:溙(五筆IDWI),須調出GBK字符集才能打出這個字。極品五筆中可右擊輸入法圖標,設置,屬性中選GBK字符集。極點五筆中可點擊工具條中相關圖標進行轉換。

Big5

在臺灣、香港與澳門地區,使用的是繁體中文字符集。而1980年發佈的GB2312面向簡體中文字符集,並不支持繁體漢字。在這些使用繁體中文字符集的地區,一度出現過不少不一樣廠商提出的字符集編碼,這些編碼彼此互不兼容,形成了信息交流的困難。爲統一繁體字符集編碼,1984年,臺灣五大廠商宏碁、神通、佳佳、零壹以及大衆一同制定了一種繁體中文編碼方案,因其來源被稱爲五大碼,英文寫做Big5,後來按英文翻譯回漢字後,廣泛被稱爲大五碼。

大五碼是一種繁體中文漢字字符集,其中繁體漢字13053個,808個標點符號、希臘字母及特殊符號。大五碼的編碼碼錶直接針對存儲而設計,每一個字符統一使用兩個字節存儲表示。第1字節範圍81H-FEH,避開了同ASCII碼的衝突,第2字節範圍是40H-7EH和A1H-FEH。由於Big5的字符編碼範圍同GB2312字符的存儲碼範圍存在衝突,因此在同一正文不能對兩種字符集的字符同時支持。

Unicode

如上ANSI編碼條例中所述,世界上存在着多種編碼
方式,在ANSi編碼下,同一個編碼值,在不一樣的編碼體系裏表明着不一樣的字。在簡體中文系統下,ANSI 編碼表明 GB2312 編碼,在日文操做系統下,ANSI 編碼表明 JIS 編碼,可能最終顯示的是中文,也可能顯示的是日文。在ANSI編碼體系下,要想打開一個文本文件,不但要知道它的編碼方式,還要安裝有對應編碼表,不然就可能沒法讀取或出現亂碼。爲何電子郵件和網頁都常常會出現亂碼,就是由於信息的提供者多是日文的ANSI編碼體系和信息的讀取者多是中文的編碼體系,他們對同一個二進制編碼值進行顯示,採用了不一樣的編碼,致使亂碼。這個問題促使了unicode碼的誕生。

若是有一種編碼,將世界上全部的符號都歸入其中,不管是英文、日文、仍是中文等,你們都使用這個編碼表,就不會出現編碼不匹配現象。每一個符號對應一個惟一的編碼,亂碼問題就不存在了。這就是Unicode編碼。

Unicode固然是一個很大的集合,如今的規模能夠容納100多萬個符號。每一個符號的編碼都不同,好比,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,「漢」這個字的Unicode編碼是U+6C49。

Unicode當然統一了編碼方式,可是它的效率不高,好比UCS-4(Unicode的標準之一)規定用4個字節存儲一個符號,那麼每一個英文字母前都必然有三個字節是0,這對存儲和傳輸來講都很耗資源。

UTF-8

爲了提升Unicode的編碼效率,因而就出現了UTF-8編碼。UTF-8能夠根據不一樣的符號自動選擇編碼的長短。好比英文字母能夠只用1個字節就夠了。

UTF-8的編碼是這樣得出來的,以」漢」這個字爲例:

「漢」字的Unicode編碼是U+00006C49,而後把U+00006C49經過UTF-8編碼器進行編碼,最後輸出的UTF-8編碼是E6B189。

 

補充:

32位和64位 /31bit和64bit的區別

1.  對操做系統來講,64位和32位指最大內存尋址空間,32位最大4GB(2^32),64位理論上16EB(2^64),但如今通常都是2^48

二、對硬件來講,64位和32位指數據寬度,64位一次取8字節y也就是64bit,32取4字節也就是32bit,因此理論上64位比32位性能提升了一倍。實際上的狀況是,達不到,內存變大了,須要尋址更多。

三、對應用程序來講,應用程序基於操做系統 和硬件,其使用的指令寬度隨系統和硬件變化。

32位和64位區別的最多見表現就是64萬位操做系統能夠支持4G以上的內存。缺點也是內存佔用,64位代碼比32位代碼多佔用空間,

如今來看64位操做系統兼容32位軟件,反之則不行。

相關文章
相關標籤/搜索