<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] * * * * * ### 一、二進制(bit) #### **1.二進制的由來** 計算機一開始發明出來時是用來解決數字計算問題的,后來人們發現,計算機還可以做更多的事,例如文本處理。 計算機只“認識” 010110111000…這樣由0和1兩個數字組成的二進制數字,這是因為計算機的底層硬件實現就是用電路的開和閉兩種狀態來表示0和1兩個數字的。因此,計算機只可以直接存儲和處理二進制數字。另外控制開關這兩種狀態的底層硬件其實就是晶體管(由Bell實驗室的William B. Shockley、 John Bardeen和Walter H. Brattain.發明的) 晶體管是一種微型電子開關。它們是計算機的"大腦"--微處理器的基本組成部分。與基本的照明開關類似,晶體管有兩種工作狀態:通和斷。晶體管的通/斷(二進制功能)實現了計算機內部的信息處理。 計算機唯一能夠理解的信息就是通和斷兩種狀態的電信號。我們知道開關式電子電路由電線(電流流經的電路)和開關(通過閉合或切斷電路來開/關閉電路的設備)。晶體管沒有機械運動的部件,它通過電信號在通和斷兩種狀態之間轉換。晶體管的通/斷轉換使微處理器能夠完成工作。 計算機所處理的數據信息,是以二進制數編碼表示的,其二進制數"0"和"1"是構成信息的最小單位(也是目前表示信息最簡單的方式),稱作"位"或"比特(bit)". 另外磁盤里的二進制是用N極和S極表示0和1的最終在變成電流信號 “斷”和“通”來交給CPU處理,光盤上使用“長”和“短”的小鏡子來表示1和0的,光盤上邊都是長點和短點,通過激光的照射,根據反光的長度來表示數據 #### **2. 二進制數值的通俗含義** 網上經常說二進制是逢二進一,十進制是逢十進一,我們日常生活中計算都是以十進制運算的。那么二進制運算是怎么來表示出和十進制相同的含義的。 這里有一個人們常提及的例子:比如我想用燈泡的開關(亮/暗)來表示屋子里進入了多少人。為了盡可能少的使用燈泡,我們定義了從右邊開始第一個燈泡亮時代表 2的0次方個人,第二個燈泡亮時代表2的1次方個人,第三個燈泡亮時代表2的3次方個人,暗燈泡代表沒有人以此類推。 屋里有1個人時:一個暗燈泡即可表示(二進制 1) 屋里有2個人時:一個亮燈泡即可表示(二進制 10) 屋里有3個人時:2個亮燈泡即可表示(二進制 11) 屋里有4個人時:2個暗燈泡和1個亮燈泡即可表示(二進制 100) 屋里有5個人時:1個暗燈泡兩個亮即可表示(二進制 101) 屋里有6個人時:二進制 110 屋里有7個人時:二進制位 111 屋里有8個人時:二進制位 1000 屋里有9個人時:二進制位 1001 . . . 屋里有255個人時:二進制位 11111111 屋里有256個人時:二進制位 100000000 ### 二、字節(B) #### **1.字節單位的由來** 多個晶體管產生的1和0所形成的特定序列和模式可以表示字母、數字、顏色和圖形等字符。這就是我們所熟悉的二進制表示法。 計算機是美國發明的,怎么表示他們的英文符號,數字,標點符號等。這些符號加起來共有127個,即2的7次方,于是他們規定8位二進制表示一個字符,其中用一個位來進行數據校驗,其他七個位用來記錄數據。于是規定8個位為一個“字節”,相當于用8個可以開合的晶體管來組成不同的狀態以表示字符。 #### **2. 存儲單位的換算** - 1b (字節) = 8bit (比特) - 1kb (千字節) = 1024b (字節) - 1MB (兆字節) = 1024kb (千字節) - 1GB (吉字節)- 1024MB (兆字節) - 1TB = 1024GB (吉字節) - 1PB = 1024TB ### 三、ASCII碼 #### **1.ASCII碼的由來** 開始計算機只在美國用。八位的字節一共可以組合出256(2的8次方)種不同的狀態。 他們把其中的編號從0開始的32種狀態分別規定了特殊的用途,一但終端、打印機遇上約定好的這些字節被傳過來時,就要做一些約定的動作。遇上00x10, 終端就換行,遇上0x07, 終端就向人們嘟嘟叫,例如遇上0x1b, 打印機就打印反白的字,或者終端就用彩色顯示字母。他們看到這樣很好,于是就把這些0x20以下的字節狀態稱為"控制碼". 他們又把所有的空格、標點符號、數字、大小寫字母分別用連續的字節狀態表示,一直編到了第127號,這樣計算機就可以用不同字節來存儲英語的文字了。大家 看到這樣,都感覺很好,于是大家都把這個方案叫做 ANSI 的"Ascii"編碼(American Standard Code for Information Interchange,美國信息互換標準代碼)。當時世界上所有的計算機都用同樣的ASCII方案來保存英文文字。 ASCII碼使用7位2進制數表示一個字符,這樣,7位2進制數可以表示出2的7次方個字符,共128個字符.。這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節的后面7位,最前面的1位(最高位)在計算機內部通常保持為 0 (在數據傳輸時可用作奇偶校驗位)。 ![ascii表](http://img.my.csdn.net/uploads/201301/10/1357825617_4008.png) #### **1.ASCII擴展碼** 英語用128個符號編碼就夠了,但隨著計算機技術發展,一些發達國家也開始使用了計算機,而有些國家用的不是英文,他們的字母里有許多是ASCII里沒有的,比如,在法語中,字母上方有注音符號,它就無法用ASCII碼表示。為此,國際標準化組織又制定了 ISO2022 標準,它規定了在保持與 ISO646 兼容的前提下將 ASCII 字符集擴充為 8 位代碼的統一方法。 ISO 陸續制定了一批適用于不同地區的擴充 ASCII 字符集,每種擴充 ASCII 字符集分別可以擴充 128 個字符,比如,法語中的é的編碼為130(二進制10000010)。這些擴充字符的編碼均為高位為 1 的 8 位代碼(即十進制數 128~255 ),稱為擴展 ASCII 碼。 由于不同的國家有不同的字母,因此, 擴充的ASCII編碼,雖然它們都使用256個符號的編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (?),在俄語編碼中又會代表另一個符號。但是不管怎樣,所有這些編碼方式中,0—127表示的符號是一樣的,不一樣的只是128—255的這一段。 ### 四、 Unicod編碼 #### **1.Unicod編碼的由來** 計算機發明之處及后面很長一段時間,只用應用于美國及西方一些發達國家,ASCII能夠很好滿足用戶的需求. 一個以字節就可以對這些字符進行編碼。 但人類的貪婪是無限的,后來世界各個地區也將會用到計算機。而這些國家的語言字符不止256個,像咱祖先留給我們的常用漢字就有6000多個。 為了顯示本國語言,必須對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也可以轉換到其他所有的編碼。 #### **2.Unicod編碼的問題** 需要注意的是,Unicode 只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。 比如,漢字嚴的 Unicode 是十六進制數4E25,轉換成二進制數足足有15位(100111000100101),也就是說,這個符號的表示至少需要2個字節。表示其他更大的符號,可能需要3個字節或者4個字節,甚至更多。 這里就有兩個嚴重的問題,第一個問題是,如何才能區別 Unicode 和 ASCII ?計算機怎么知道三個字節表示一個符號,而不是分別表示三個符號呢?第二個問題是,我們已經知道,英文字母只用一個字節表示就夠了,如果 Unicode 統一規定,每個符號用三個或四個字節表示,那么每個英文字母前都必然有二到三個字節是0,這對于存儲來說是極大的浪費,文本文件的大小會因此大出二三倍,這是無法接受的。 它們造成的結果是:1)出現了 Unicode 的多種存儲方式,也就是說有許多種不同的二進制格式,可以用來表示 Unicode。2)Unicode 在很長一段時間內無法推廣,直到互聯網的出現。 ### 五、GB2312(ASCII的中文擴展)   等中國人們得到計算機時,已經沒有可以利用的字節狀態來表示漢字,況且有6000多個常用漢字需要保存呢。但是這難不倒智慧的中國人民,我們不客氣地把那些127號之后的奇異符號們直接取消掉,   規定:一個小于127的字符的意義與原來相同,但兩個大于127的字符連在一起時,就表示一個漢字,前面的一個字節(他稱之為高字節)從0xA1用到 0xF7,后面一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼里,我們還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在 ASCII 里本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的"全角"字符,而原來在127號以下的那些就叫"半角"字符了。 GB 2312是一個簡體中文字符集,由6763個常用漢字和682個全角的非漢字字符組成。其中漢字根據使用的頻率分為兩級。一級漢字3755個,二級漢字3008個。由于字符數量比較大,GB2312采用了二維矩陣編碼法對所有字符進行編碼。首先構造一個94行94列的方陣,對每一行稱為一個“區”,每一列稱為一個“位”,然后將所有字符依照下表的規律填寫到方陣中。這樣所有的字符在方陣中都有一個唯一的位置,這個位置可以用區號、位號合成表示,稱為字符的區位碼。如第一個漢字“啊”出現在第16區的第1位上,其區位碼為1601。因為區位碼同字符的位置是完全對應的,因此區位碼同字符之間也是一一對應的。這樣所有的字符都可通過其區位碼轉換為數字編碼信息。   中國人民看到這樣很不錯,于是就把這種漢字方案叫做 "GB2312"。GB2312是ANSI編碼的一種,即對 ASCII 的中文擴展。是中國國家標準總局發布了一系列的漢字字符集國家標準編碼,統稱為GB碼,或國標碼。其中最有影響的是于1980年發布的《信息交換用漢字編碼字符集 基本集》,標準號為GB 2312-1980,因其使用非常普遍,也常被通稱為國標碼。GB2312編碼通行于我國內地;新加坡等地也采用此編碼。幾乎所有的中文系統和國際化的軟件都支持GB 2312。 GB2312編碼用兩個字節(8位2進制)表示一個漢字,所以理論上最多可以表示256×256=65536個漢字。但這種編碼方式也僅僅在中國行得通,如果您的網頁使用的GB2312編碼,那么很多外國人在瀏覽你的網頁時就可能無法正常顯示,因為其瀏覽器不支持GB2312編碼。當然,中國人在瀏覽外國網頁(比如日文)時,也會出現亂碼或無法打開的情況,因為我們的瀏覽器沒有安裝日文的編碼表。   但由于中國的漢字太多了,我們很快就就發現有許多人的人名沒有辦法在這里打出來,特別是某些很會麻煩別人的國家領導人。于是我們不得不繼續把 GB2312 沒有用到的碼位找出來老實不客氣地用上。   GBK:后來還是不夠用,于是干脆不再要求低字節一定是127號之后的內碼,只要第一個字節是大于127就固定表示這是一個漢字的開始,不管后面跟的是不是擴展字 符集里的內容。結果擴展之后的編碼方案被稱為 GBK 標準,GBK 包括了 GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。   GB18030:后來少數民族也要用電腦了,于是我們再擴展,又加了幾千個新的少數民族的字,GBK 擴成了GB18030。從此之后,中華民族的文化就可以在計算機時代中傳承了。 GB 18030,全稱:國家標準GB 18030-2005《信息技術 中文編碼字符集》,是中華人民共和國現時最新的內碼字集,是GB 18030-2000《信息技術 信息交換用漢字編碼字符集 基本集的擴充》的修訂版。與GB 2312完全兼容,與GBK基本兼容,支持GB 13000及Unicode的全部統一漢字,共收錄漢字70244個。GB 18030主要有以下特點: - 與UTF-8相同,采用多字節編碼,每個字可以由1個、2個或4個字節組成。 - 編碼空間龐大,最多可定義161萬個字符。 - 支持中國國內少數民族的文字,不需要動用造字區。 - 漢字收錄范圍包含繁體漢字以及日韓漢字   中國的程序員們看到這一系列漢字編碼的標準是好的,于是通稱他們叫做 "DBCS"(Double Byte Charecter Set 雙字節字符集)。在DBCS系列標準里,最大的特點是兩字節長的漢字字符和一字節長的英文字符并存于同一套編碼方案里,因此他們寫的程序為了支持中文處 理,必須要注意字串里的每一個字節的值,如果這個值是大于127的,那么就認為一個雙字節字符集里的字符出現了。那時候凡是受過加持,會編程的計算機僧侶 們都要每天念下面這個咒語數百遍:   "一個漢字算兩個英文字符!一個漢字算兩個英文字符……" ### 六、utf-8 編碼 互聯網的普及,強烈要求出現一種統一的編碼方式。UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式。其他實現方式還包括 UTF-16(字符用兩個字節或四個字節表示)和 UTF-32(字符用四個字節表示),不過在互聯網上基本不用。重復一遍,這里的關系是,UTF-8 是 Unicode 的實現方式之一。 UTF-8 最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。 UTF-8 的編碼規則很簡單,只有二條: 1)對于單字節的符號,字節的第一位設為0,后面7位為這個符號的 Unicode 碼。因此對于英語字母,UTF-8 編碼和 ASCII 碼是相同的。 2)對于n字節的符號(n > 1),第一個字節的前n位都設為1,第n + 1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的 Unicode 碼。 下表總結了編碼規則,字母x表示可用編碼的位。 ```JavaScript Unicode符號范圍 | UTF-8編碼方式 (十六進制) | (二進制) ----------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 跟據上表,解讀 UTF-8 編碼非常簡單。如果一個字節的第一位是0,則這個字節單獨就是一個字符;如果第一位是1,則連續有多少個1,就表示當前字符占用多少個字節。 下面,還是以漢字嚴為例,演示如何實現 UTF-8 編碼。 嚴的 Unicode 是4E25(100111000100101),根據上表,可以發現4E25處在第三行的范圍內(0000 0800 - 0000 FFFF),因此嚴的 UTF-8 編碼需要三個字節,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,從嚴的最后一個二進制位開始,依次從后向前填入格式中的x,多出的位補0。這樣就得到了,嚴的 UTF-8 編碼是11100100 10111000 10100101,轉換成十六進制就是E4B8A5。 ``` ### 七、Unicode 與 UTF-8 之間的轉 通過上一節的例子,可以看到嚴的 Unicode碼 是4E25,UTF-8 編碼是E4B8A5,兩者是不一樣的。它們之間的轉換可以通過程序實現。 Windows平臺,有一個最簡單的轉化方法,就是使用內置的記事本小程序notepad.exe。打開文件后,點擊文件菜單中的另存為命令,會跳出一個對話框,在最底部有一個編碼的下拉條。 ![下拉條](http://www.ruanyifeng.com/blog/2007/10/bg2007102801-thumb.jpg) 里面有四個選項:ANSI,Unicode,Unicode big endian和UTF-8。 1)ANSI是默認的編碼方式。對于英文文件是ASCII編碼,對于簡體中文文件是GB2312編碼(只針對 Windows 簡體中文版,如果是繁體中文版會采用 Big5 碼)。 2)Unicode編碼這里指的是notepad.exe使用的 UCS-2 編碼方式,即直接用兩個字節存入字符的 Unicode 碼,這個選項用的 little endian 格式。 3)Unicode big endian編碼與上一個選項相對應。我在下一節會解釋 little endian 和 big endian 的涵義。 4)UTF-8編碼,也就是上一節談到的編碼方法。 選擇完"編碼方式"后,點擊"保存"按鈕,文件的編碼方式就立刻轉換好了。 ### 八、Little endian 和 Big endian 上一節已經提到,UCS-2 格式可以存儲 Unicode 碼(碼點不超過0xFFFF)。以漢字嚴為例,Unicode 碼是4E25,需要用兩個字節存儲,一個字節是4E,另一個字節是25。存儲的時候,4E在前,25在后,這就是 Big endian 方式;25在前,4E在后,這是 Little endian 方式。 這兩個古怪的名稱來自英國作家斯威夫特的《格列佛游記》。在該書中,小人國里爆發了內戰,戰爭起因是人們爭論,吃雞蛋時究竟是從大頭(Big-endian)敲開還是從小頭(Little-endian)敲開。為了這件事情,前后爆發了六次戰爭,一個皇帝送了命,另一個皇帝丟了王位。 第一個字節在前,就是"大頭方式"(Big endian),第二個字節在前就是"小頭方式"(Little endian)。 那么很自然的,就會出現一個問題:計算機怎么知道某一個文件到底采用哪一種方式編碼? Unicode 規范定義,每一個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做"零寬度非換行空格"(zero width no-break space),用FEFF表示。這正好是兩個字節,而且FF比FE大1。 如果一個文本文件的頭兩個字節是FE FF,就表示該文件采用大頭方式;如果頭兩個字節是FF FE,就表示該文件采用小頭方式。 ### 參考文獻 - [字符編碼詳解及由來](https://blog.csdn.net/hguisu/article/details/7106394) - [字符編碼筆記:ASCII,Unicode 和 UTF-8](http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看