ASCII和萬國碼

什麼是ASCII網絡

    計算機的起初是使用內存中的0101來表示數和機器碼。如何用內存中的bit來表示文本一直困擾着人們,畢竟人類主要的信息展現是文字,而不是苦澀的0101。後來ASCII碼的發明成功的解決了「部分」問題。說白了ASCII碼就是解決了一個以數字形式表示文本的問題。函數

     ASCII碼全稱爲美國信息交換標準碼「American Standard Code for Information Interchange」。目前它已被國際標準化組織(ISO)定爲國際標準,稱爲ISO 646標準。適用於全部拉丁文字字母,ASCII碼有7位碼和8位碼兩種形式。在計算機的存儲單元中,一個ASCII碼值佔一個字節(8個二進制位)編碼

 

    7位ASCII碼是用七位二進制數進行編碼的,能夠表示128個字符。其最高位(b7)用做奇偶校驗位。所謂奇偶校驗,是指在代碼傳送過程當中用來檢驗是否出現錯誤的一種方法,通常分奇校驗和偶校驗兩種。奇校驗規定:正確的代碼一個字節中1的個數必須是奇數,若非奇數,則在最高位b7添1;偶校驗規定:正確的代碼一個字節中1的個數必須是偶數,若非偶數,則在最高位b7添1。操作系統

 

    第0~32號及第127號(共34個)是控制字符或通信專用字符,如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BEL(振鈴)等;通信專用字符:SOH(文頭)、EOT(文尾)、ACK(確認)等; code

    第33~126號(共94個)是字符,其中第48~57號爲0~9十個阿拉伯數字;65~90號爲26個大寫英文字母,97~122號爲26個小寫英文字母,其他爲一些標點符號、運算符號等。 orm

 

    讓咱們到幕後去看看,看看ASCII碼是如何以數字形式表示文本的。舉2個例子:內存

     如ASCII碼'A' -- 其內存存儲字節2進製表示爲"01000001" --- 其16進制值爲0x41 --- 其10進制值爲65(這裏的值其實是'A'在ASCII碼錶中編號);  ci

   驗證過程:字符串

   char c = 'A';it

   printf("%c\n", c);

   printf("%x\n", c);

   printf("%d\n", c);

 

     又如 ASCII碼'6' -- 其內存存儲字節2進製表示爲"00110110" --- 其16進制值爲0x36 --- 其10進制值爲54(這裏的值其實是'6'在ASCII碼錶中的編號);  

    驗證過程:

    char c = '6';

    printf("%c\n", c);

    printf("%x\n", c);

    printf("%d\n", c);

 

     一個字符串在內存中就是按照逐個字符的ASCII碼連續存放的,咱們在傳送字符串時通常無需作特殊轉換。

    FTP協議中有兩種通信方式,其中一種是ASCII碼方式,即文本方式)這裏也舉例說明:好比咱們要傳送數值123, 123數值用16進製表示爲0x7b,以二進制表示爲01111011,那麼以二進制方式通信,01111011就是咱們真實傳送的數據,可是若是以ASCII碼方式通信,則徹底不一樣了,若是你還傳送01111011的話,對方那邊的獲得的將是'{'('{'對應的ASCII碼用16進製表示爲7b)。正確的方式就是將123每位上的數字轉化爲其相應的ASCII碼,而後傳送。這裏'1'、'2'和'3'對應的ASCII碼用16進製表示分別爲0x3一、0x32和0x33。這樣組合起來後要傳送的數據應爲"001100010011001000110011"。  

    

什麼是UNICODE

    Unicode碼也是一種國際標準編碼,採用二個字節編碼,與ANSI碼不兼容,對於ASCII字符它也使用兩字節表示。   

    起初都是用ASCII碼來表示字符。這些字符能夠是字母。數字。標點符號和控制符。用這種編碼來表示英文在內的字符不成問題的。但要表示其它語言文字如。阿拉伯文。中文。日文。維文。哈文…必須進行擴充

 

    對於中文而言,則必須使用兩個字節(byte)來表明一個字符,具第一個字節必須大於127(因此咱們有許程序判斷中文都是以ascii碼大於127做爲條件)。以上用兩個字節來表示一箇中文的方式,在習慣上稱爲雙字節(即DBCS: Double-Byte Character Set),而相對之下,英文的字符碼就稱爲單字節SBCS(Single-Byte Character Set)。  

    雖然雙字節(DBCS)足以解決中英文字符混合使用狀況,但對於不一樣字符系統而言,必須通過字符碼轉換,很是麻煩。例如:中英文混合狀況等。爲解決這個問題,國際標準組織於1984年4月成立ISO/IEC JTC1/SC2/WG2工做組。針對各國文字、符號進行統一性編碼。1991年美國跨國公司成立Unicode Consortium。並於1991年10月與WG2達成協議。採用同一編碼字集。目前Unicode是採用16位編碼體系。其字符集內容與ISO10646的BMP(Basic Multilingual Plane)相同。Unicode於1992年6月經過DIS(Draf International Standard)。目前版本V2.0於1996公佈。內容包含符號6811個。漢字20902個。韓文拼音11172個。造字區6400個。保留20249個。共計65534個。  

    UNICODE同如今流行的代碼頁最顯著不一樣點在於:UNICODE是兩字節的全編碼。對於ASCII字符它也使用兩字節表示。代碼頁是經過高字節的取值範圍來肯定是ASCII字符。仍是漢字的高字節。若是發生數據損壞。某處內容破壞。則會引發其後漢字的混亂。UNICODE則一概使用兩個字節表示一個字符。最明顯的好處是它簡化了漢字的處理過程。

    Unicode的最初目標。是用1個16位的編碼來爲超過65000字符提供映射。但這還不夠。它不能覆蓋所有歷史上的文字。也不能解決傳輸的問題(implantation head-ache's)。尤爲在那些基於網絡的應用中。所以。Unicode用一些基本的保留字符制定了三套編碼方式。它們分別是UTF-8,UTF-16和UTF-32。正如名字所示。在UTF-8中。字符是以8位序列來編碼的。用一個或幾個字節來表示一個字符。這種方式的最大好處。是UTF-8保留了ASCII字符的編碼作爲它的一部分。例如。在UTF-8和ASCII中。「A」的編碼都是0x41.UTF-16和UTF-32分別是Unicode的16位和32位編碼方式。考慮到最初的目的。一般說的Unicode就是指UTF-16。

   

Unicode的特色是:

     無論哪一國的字符碼均以兩個Byte表示,例如"A"在Unicode則是16進制 41和00的組合,即4100,高位41(轉換爲Ascii碼便是65=A),Windows NT/2000以Unicode來表示字符集,例如你能夠看到MS SQL Server中產生的SQL文件能夠選擇是以Unicode來保存仍是以普通格式來保存,若是你以Unicode保存,則在95/98平臺許多軟件均沒法正確讀出其格式。  

 

    同時你還能夠注意到95/98中API定義,許多名稱結尾是有一個A的,例如 WriteProfileStringA  

    而在NT/2000操做系統中,提供了兩套API,另一個命令是WriteProfileStringW,以W 結尾的API只適用於NT / 2000。(在NT中使用以W結尾的API函數效率比A結尾的要快,由於省去了Unicode和DBCS/SBCS的轉換過程)  

    這樣咱們常常要用到的判斷字符串長度的函數,在NT和95/98下執行結果不一樣,以下 

    95/98中: len("abc中國") 返回 7 (由於每一箇中文做爲兩個Ascii碼來看)   

    NT/2000中: len("abc中國") 返回 5 (由於每一個字符都做爲一個Unicode來看)

相關文章
相關標籤/搜索