歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

計算機組成.人機轉換大字典.幾種字符編碼

一直到我剛上大學第一次在黑白控制台裡打印出了“Hello World”之前,我都當電腦是一個游戲機,還天真的以為世界上只有windows一個操作系統。 當時也是第一次接觸了ASCII編碼,才知道計算機裡的二進制,要轉換成人類可理解的內容,還得需要一種人為的規定 即對於每個二進制的數字,電腦就按照我們賦予的一對一的規則,在屏幕上顯示相應的字符。 本文內容七七八八來自課本網絡各個角落,,,,,,

ASCII

美國信息交換標准編碼(American Standard Code Information Interchange)。一開始我竟然愚蠢的認為ASCII後面的II是羅馬數字2的意思一直到我看到了英語,,,,,,簡直要笑死我自己了哈哈哈 查ASCII資料的時候竟是追回到了電報時代,畢竟ASCII算是首個可以流傳到今天的編碼,而且其誕生於IBM公司忙於研制革命性的OS/360的時代,也恰恰算是計算機差不多真正開始奔跑的時代

莫爾斯電碼

1837年。美國畫家塞缪爾·莫爾斯發明了莫爾斯電碼,
並於1844年在美國國會的財政支持下,開設了從馬裡蘭州的巴爾地摩到美國首都華盛頓的第一條使用“莫爾斯碼”通信的電報線路,是人類數字通信歷史上的一個重要的裡程碑。 莫爾斯碼是變長編碼,在通信中也加大了接收方階碼的難度,需要操作人員具有很高的技巧和熟練程度。 貼一張來自百度的圖 莫爾斯碼

博多電傳碼

1874年。法國人埃米爾·博多(Emile Baudot)發明了劃時代的博多電傳碼
采用等長編碼,這為機器自動編碼奠定了基礎 當時的電傳使用多路復用技術,即多跟電線來完成一次通信 編碼器采用類似鋼琴鍵的五個按鍵 博多碼編碼器 原本2^5=32意味著五位的編碼最多可表示32個字符,而27個字母加上十個數字以及數個標點早已超出了32。博多的解決方法是采用了兩套32個字符的字符集。第一套主要是字母表,以及一個切換到第二套的符號。第二套主要是十個數字和標點,以及一個切換到第一套的符號。<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPtXi0fmz/cilPHN0cm9uZz7Bvbj217TMrNequ7u1xLf7usU8L3N0cm9uZz7N4qOs0ru5sr/Jse3KvrXE19a3+77NwKm087W9wcs2Mrj2oaMNCjxoNCBpZD0="默裡碼">默裡碼 然而博多碼確立了五位編碼的基礎,還沒來得及商業化,就被更容易操作的默裡碼取代
1899年,美國農場主唐納德·默裡(Donald Murray)發明了類似標准打字機的電報輸入設備,也就是說當想輸入一個字母’a’的時候,不必再輸入’a’的編碼,而只需要按下鍵盤上的’a’即可。 采用的編碼方案的基礎是博多碼,在博多碼的基礎上根據字符出現的頻率改進了編碼的方案,因為當時的輸出是穿孔紙帶,改進後的編碼使得高頻率的字符可以盡量少的打孔,如字母T僅需要1個孔來表示,而Q則需要4個孔。

ITA-2

30年後的1930年代,默裡碼被CCITT(國際電報電話咨詢委員會,國際電信聯盟(ITU)的前身)所接納,並標准化為the International Telegraph Alphabet No. 2(ITA-2),直到1963年
ITA2

ASCII

1963年6月17日,美國標准協會(ASA)的X.34小組成員公布了劃時代的美國信息交換標准碼ASCII
采用7位編碼,在ITA-5的基礎上發展而來。 1963年的版本有過大的缺陷和不完善,比如沒有小寫字母、某些圖形符號混亂,左箭頭與下劃線混淆,上箭頭與’^’符號的定義等問題,這個版本很快被1967年的新ASCII標准所取代 細講起來,1967年才算最終的定案。 最初為美國國家標准,後來被國際標准化組織(International Organization for Standardization, ISO)定為國際標准,稱為ISO 646標准。 由於字節是計算機信息存儲與處理的基本單位,而一個ASCII碼為7位,但仍總是存儲在一個字節裡,並將最高位恆置為0。後來為了檢測錯誤,就講最高位設為奇偶校驗位。 後來隨著計算機硬件的可靠性不斷提高,其奇偶檢驗位也越來越沒有必要。
增加的128個字符主要是帶重音符(法文)、帶變音符(德文)的拉丁字母以及制表符。 1981年,最初的IBM PC推出時,視訊卡的ROM中就燒有一個提供256個字元的字元集,這也成為IBM標准的一個重要組成部分。
這就是最初的IBM字元集,在代碼頁的概念下為 code page 437,也叫「MS-DOS Latin US」 「MS-DOS Latin US」直通車:https://msdn.microsoft.com/en-us/library/cc195060.aspx 1985年11月發行的Windows 1.0中,Microsoft沒有完全放棄四年前IBM PC上的擴展ASCII,但它已退居第二重要位置。因為遵循了ANSI草案和ISO標准,純Windows字元集被稱作「ANSI字元集」。
ANSI草案和ISO標准最終成為ANSI/ISO 8859-1-1987,即「American National Standard for Information Processing-8-Bit Single-Byte Coded Graphic Character Sets-Part 1: Latin Alphabet No 1」,通常也簡寫為「Latin 1」。 「Latin 1」直通車:https://msdn.microsoft.com/en-us/library/cc195064.aspx 也可以稱為EASCII字符集。 1987年4月發行的MS-DOS 3.3向IBM PC用戶引進了 code page 的概念,Windows也使用此概念。有人譯為 內碼表 , 個人更喜歡 代碼頁 。感覺code page更像一本書而不是一張表。
With the release of PC DOS version 3.3 (and the near identical MS-DOS 3.3) IBM introduced the code page numbering system to regular PC users, as the code page numbers (and the phrase “code page”) were used in new commands to allow the character encoding used by all parts of the OS to be set in a systematic way. After IBM and Microsoft ceased to cooperate in the 1990s, the two companies have maintained the list of assigned code page numbers independently from each other, resulting in some conflicting assignments. At least one third-party vendor (Oracle) also has its own different list of numeric assignments. IBM’s current assignments are listed in their CCSID repository, while Microsoft’s assignments are documented within the MSDN. Additionally, a list of the names and approximate IANA (Internet Assigned Numbers Authority) abbreviations for the installed code pages on any given Windows machine can be found in the Registry on that machine (this information is used by Microsoft programs such as Internet Explorer). 好吧上面兩段來自維基百科。翻譯起來實在累,就不打算翻譯了。而且個人覺得英文讀起來確實蠻有味道,在PC上讀的話可以用一些劃詞翻譯的軟件來輔助,個人推薦靈格斯。 大意就是這個code page的概念被多家公司用,本來用來統一字符編碼,結果每家公司都不一樣,,,,,,這就十分尴尬了 給你們網址自己讀一讀吧,閒暇之余挺值得消磨時間的 : https://en.wikipedia.org/wiki/Code_page 關於code page在查詢資料的時候也發現了一些好玩的網站
http://www.ascii-codes.com/ 一個專門為ASCII建立的網站,十分有趣 http://www.ibm.com/support/knowledgecenter/ IBM的產品文檔,只是我現在還沒到達可以直接閱讀文檔的層次,,,,,,不過還是可以勉強看一下MSDN,對於IBM就不太熟悉了。 一點小規律
同一個英文字符的大小寫的編碼差異僅在第六位上,如 ‘A’ 為“01000001”,’a’ 為“01100001”。這樣在大小寫轉換的時候只需要把第六位翻轉。 對於數字 ‘0’ 到 ‘9’,其ASCII的值依次為“00110000”到“00111001”,前四位均為“0011”,後四位的值也就是 0 到 9,這樣在進行轉換的時候只需要把ASCII的編碼的高四位清0即可。 ASCII是一個非常可靠的標准。在鍵盤、視訊顯示卡、系統硬體、印表機、字體文件、操作系統和Internet上,其他標准都不如ASCII碼流行而且根深蒂固。

十進制數的編碼

計算機用二進制可以得到很大的好處,而人類已經習慣了用十進制了。所以對於十進制與二進制之間的關系就有特殊的處理方式

字符串形式

即每一個十進制的數字被當作一個字符,用一個二進制的編碼來表示。如ASCII中“00110000”到“00111001“就用來表示字符 ‘0’ 到 ‘9’。 然而這種表示雖然可以實現但實際上卻抹殺了數字本身,因為數字純粹是被當作字符來處理的 盡管在ASCII中可以以高四位清零的方式來快速獲得數字本身的值,但這又浪費了4位的空間

BCD碼

Binary Coded Decimal 僅用4位二進制就可以表示1個十進制的數字,這樣一個字節就可以表示2位十進制數字 主要用途是在十進制和二進制的轉換過程中作為中間碼。 這種編碼的方式可以帶來很高的精度,因為每一個數字都會被保存下來。
這種編碼技巧最常用於會計系統的設計裡,因為會計制度經常需要對很長的數字串作准確的計算。相對於一般的浮點式記數法,采用BCD碼,既可保存數值的精確度,又可免去使電腦作浮點運算時所耗費的時間。 分類的話
NBCD(Natural Binary Coded Decimal),也叫8421碼。就是對於4 bit,從0000到1001分別來表示數字0到9,其余的用不到。
“8421”也可以看做是對4 bit的一個權值的賦值,最高位權值為8,最低位權值為1,這也和二進制的內在原理相吻合。 NBCD 其余的按權值不同來分的話,也有諸如2421碼、5421、4221、7421碼等
感覺只需要知道如果是權值的方案,那麼權值的設計有很多種就是了。 至於每種有什麼用處,大概就需要了解發明的時候的特定的環境了吧。 而且不同的權值設計,也帶來了不同的特性。比如2421碼的10個數碼中,每個數 n 所對應的二進制編碼取反後得到的編碼對應的數 m,則有 n + m = 9。稱這種特性為“對9的自補”。 余3碼:8421碼每個加3得到。 余3碼 由於余3碼在8421的基礎上加3之後,把8421沒有編制的六個編碼平均到了兩端,這使得余3碼具備了“對9的自補”特性。 Gray碼,二進制格雷碼(Binary Gray Code)簡稱格雷碼,1953年公開的弗蘭克·格雷(Frank Gray,18870913-19690523)專利“Pulse Code Communication”而得名。
下圖是Gray’s patent introduces the term “reflected binary code”,【From Wikipedia】 Gray's patent introduces the term 特點是湘…?http://www.2cto.com/database/DB2/" target="_blank" class="keylink">DB2sr919bWrrzktcS2/r341sax4MLr1rvT0NK7zruyu82soaMgtbHKscrHzqrBy82o0bajrLy01NrK/S/Eo9equ7vG972rtv69+NbG16q7u7PJxKPE4tDFusW1xMqxuvKjrMjnufu4xLHkwcu1xMr919a1xLb+vfjWxrHgwuvT0Lbgzruyu82stcS7sKOsvs274bL6yfq63LTztcS84rfltefB98L2s+WjrLHIyOc4NDIxz8IztcQmbGRxdW87MDAxMSZyZHF1bzu1vTS1xCZsZHF1bzswMTAwJnJkcXVvO77N09AzzrvSqrjEseSho7b4R3JhecLrtcTM2LXjsaPWpMHLz+DB2sr9zrvWrrzktcSy7r7g1rvT0DHOu6Os1eLKubXDR3JhebHktcO4/M6qv8m/v6GjIM6su/nNqLXAo7podHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HcmF5X2NvZGUgJmxkcXVvO0JDRMLrJnJkcXVvO86su/nNqLXAPGJyIC8+DQpodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnktY29kZWRfZGVjaW1hbCNDb21wYXJpc29uX3dpdGhfcHVyZV9iaW5hcnkNCjxoNCBpZD0="ebcdic">EBCDIC Extended Binary Coded Decimal Interchange Code
在IBM System/360問世之前,IBM曾采用一種6位的BCD碼的變種來表示字符和數字 後來System/360的設計師決定將6位的BCD碼擴展為8位的BCD碼來表示更多的字符,就設計了新的編碼方案,稱為“擴展的BCD交換碼”,即EBCDIC
EBCDIC was devised in 1963 and 1964 by IBM and was announced with the release of the IBM System/360 line of mainframe computers. 維基通道:https://en.wikipedia.org/wiki/EBCDIC 8位的EBCDIC的高四位為“區(Zone)”,低四位為“數(Digit)”。 通過檢查區位值,可以直接判斷字符是否屬於某個字符范圍 英文字母的大小寫轉換也同樣只需要翻轉一位即從高位數的第2位。

Unicode

從ASCII中A所代表的American來看就知道,ASCII只是美國為自己國家打造的字符集
而每個國家的語言不同,所需要的字符也不同 其次在不同的平台上,字符集的實現也有各自的標准 以上問題如果不處理好,將使得計算機之間的信息交換變得麻煩
你即必須要知道對方是用的那種字符集,你才能理解對方發的一串串二進制代碼究竟是什麼意思。 而一旦放寬了限制,我相信字符集將出現N多種,以至於無法管理。 另外如果你想像我現在一樣寫一篇中英文混雜的文章,那麼傳統的字符編碼要麼只能編碼英文要麼只能編碼中文,對於多語言混雜就無能為力了 Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。

字符集與字符編碼方式

字符集:對每個我想編碼的字符,我分配給它一個唯一的數值,用來建立數值和字符之間的一一對應的關系。
ASCII可以認為是一個字符集,它把128個字符一一對應到了0-127個數值,只不過ASCII只分配了128個字符而已,對於美國可以用,對於其他國家就不見得了。 Unicode**為每個語言每個字符都分配了一個唯一的數值**,這樣就可以兼容多語言、多平台 字符編碼方式:對於每個字符所對應的唯一的數值,我采用某種方式來組織成二進制的形式,並保證各個字符之間的編碼是可區分的,以此來在計算機內進行存儲、處理、傳輸等等操作。
就ASCII,對於每個字符所對應的數值來說,我只需要把這個數值轉換成二進制,就可以存儲在計算機裡了,而且每個字符完全可以用一個字節存儲下來 對於Unicode來說,由於Unicode為太多太多的字符分配了唯一的數值,這也導致了數值非常大
首先把數值直接轉換成二進制是可以的,只不過這時候一個字符所需要的空間就不止是一字節了,而是兩字節甚至四字節 顯然直接把數值轉換成二進制的這種編碼方法不太適合英語,我原本存一個字母用一個字節就好了,現在卻要用兩個字節,這樣就比原來多一倍的空間。不行不行太浪費了。所以對於Unicode來說,如何把數值轉換到二進制編碼來進行存儲,就有一種專門的轉換方案 Unicode Translation Format(UTF)。UTF的設計初衷主要是想節省空間,節省的空間又主要是想解決傳輸數據時數據量過大的問題。比如一篇英文文章用Unicode的直接編碼會比ASCII多占一倍,傳輸的時候也需要傳輸多一倍的數據量。

Unicode與ISO 10646(UCS)

歷史上, 有兩個獨立的, 創立單一字符集的嘗試. 一個是國際標准化組織(ISO) 的 ISO 10646 項目, 另一個是由(一開始大多是美國的)多語言軟件制造商組成的協會組織的 Unicode 項目 幸運的是, 1991年前後, 兩個項目的參與者都認識到, 世界不需要兩個不同的單一字符集. 它們合並雙方的工作成果, 並為創立一個單一編碼表而協同工作. 兩個項目仍都存在並獨立地公布各自的標准, 但 Unicode 協會和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 標准的碼表兼容, 並緊密地共同調整任何未來的擴展. 這二者的產物一個事ISO10646也叫UCS,一個就是Unicode,只不過二者互相兼容,也就是說對於同一個字符,二者均分配了同樣的數值來對應。
目前Unicode對應於UCS-2,即分配的數值大小都在2^16=65536之內,使得每個數值都可以直接用2字節的二進制編碼來保存
這種使用16位編碼空間的Unicode字符構成了基本多語言平面(Basic Multilingual Plane,簡稱BMP)
這裡提到了Unicode的語言平面的概念,一個平面對應了16位二進制可表示的范圍 0000~1FFF之間的8192個碼點用於表示拉丁文、阿拉伯文、希伯來文、古埃及文、古斯拉夫文、希臘文、非洲文、東南亞等地區的文字,這部分又稱字母表,大概是都屬於字母體系 2000~2FFF之間的4096個碼點用於表示貨幣符號和各種數學符號,又稱為符號表 3000~3FFF之間的4096個碼點用於表示漢文、日文、韓文的拼音字母及其標點符號 4000~DFFF之間的40960個碼點用於統一漢文、日文、韓文和印度文字符的表示 E000~EFFF之間的4096個碼點用於擴展編碼 F000~FFFF之間的4096個碼點用於保留編碼 最新的Unicode又定義了16個輔助平面,來表示更多的字符,這也與UCS-4保持一致,理論上可以表示2^31=2 147 483 648個字符。每個字符也就需要4個字節的二進制編碼來保存 雖然分配的數值相同,但是考慮到每個字符占用的空間過大,二者又有自己的編碼方式。
Unicode就有UTF-8、UTF-16等等編碼方式 UCS有UCS-2、UCS-4的編碼格式 對於一些細節方面的內容,可以參考二者的維基百科
Unicode:https://en.wikipedia.org/wiki/Unicode UCS:https://en.wikipedia.org/wiki/Universal_Coded_Character_Set

Unicode與UTF

Unicode中每個字符分配的唯一數值稱為“碼點” 每個“碼點”(數值)又將以特定的方式編制成二進制代碼 UTF-8 編碼
變長編碼。既然英文字母嫌2字節太長,那我還用1個字節來表示你呗。至於其余的編碼,我有特殊的手段 對於127以內的字符,直接用單字節來表示,且最高位為0。 對於0080~07FF以內的字符,采用雙字節編碼。高字節的前三位為110,低字節的前兩位為10,其余的16-5=11位剛好用來存放16位二進制數值的低11位。 對於0800~FFFF的字符,用三字節的方式來編碼。高字節前四位為1110,中字節和低字節的前兩位為10,其余的24-8=16位剛好用來存放16二進制數值。 看表~~ UTF-8 解碼的時候
如果一個字節的最高位為0,則下一個字符是用一個字節編碼的 如果前三位為110,則下一個字符是用二字節編碼的 如果前四位為1110,則下一個字符是用三字節編碼的 10用來表示當前字節是某個字符編碼的後續字節 UTF-16編碼使用2個字節對一個字符編碼,對於UCS-2中的字符(65536之內)可以直接進行編碼,對於UCS-4的字符可以采用變長編碼的方式來支持

 


中文編碼

對於漢字來說,編碼要比英文復雜得多:一個漢字就是一個字符。漢字簡直太多了,,,,,,光字典裡我記得好像就6萬多,,,,,, 而且在一篇中文文章裡常常會包含英文符號,更不用說各種各樣的數學符號、標點符號等等,,,,,, 目前,用於存儲的漢字編碼和用於輸入的漢字編碼是不同的 而且計算機對漢字的處理是由軟件來實現,CUP只提供對英文的直接處理。 如果看過上面提到的一篇涉及到中文編碼的博客,那麼對GB2312、GBK、GB18030應該有比較熟悉的認識了

漢字輸入碼

計算機的鍵盤是為輸入英文而設計的,要想輸入中文就必須建立中文漢字與鍵盤按鍵的對應規則。 這個規則就被稱為漢字輸入編碼 常見的有:
五筆字型碼 微軟拼音碼 國際區位碼

GB2312

1980年頒布的GB2312規定了3755個最常用漢字和3008個較常用漢字的編碼。 6763個漢字被分成若干個區,每個區包含94個漢字 一個漢字用兩個字節表示
首字節指明所在區 尾字節指明區內位置 GB2312是兼容ASCII的,還記得ASCII的最高位恆為0嗎,這也就使得兩個字節表示的漢字可以通過最高位為1來與一個字節表示的ASCII字符區別開來 在windows中的代碼頁為CP936

GBK

GBK 是 GB2312的擴展 ,除了兼容GB2312外,它還能顯示繁體中文,還有日文的假名 GBK國標擴展。GB2312國標。 擴充方法是,原先GB2312要求兩個字節的最高位都為1,現在允許後一個字節的最高位為1,反正有前一個字節就知道這兩個字節都是為一個中文字符服務的 GBK 包括了 GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。

GB18030

簡單的來說就是對GBK的進一步擴充
GB18030-2000版本在GBK基礎上增加了CJK統一漢字擴充A的漢字 GB18030-2005在GB18030-2000基礎上增加了CJK統一漢字擴充B的漢字。 GB18030在windows中的代碼頁為CP54936 CJK:CJK Unified Ideographs
中日韓統一表意文字 與ISO 10646(UCS)及Unicode標准內賦予相同編碼,即其中的從0x4E00到 0x9FA5 的連續區域包含了 20902 個來自中國(包括台灣)、日本、韓國的漢字,稱為 CJK (Chinese Japanese Korean) 漢字。 CJK 是GB2312-80等字符集的超集。
算是東拼西湊總算是寫完了,,,,,,期間對字符編碼也有了更深入的理解,,,,,,順便保存了好多文章到印象筆記中,只供閒暇時閱讀打發時間了。
不過還有其他打發時間的方法/////淨是娛樂罷了
Copyright © Linux教程網 All Rights Reserved