字符編碼--第3章 字符的存儲--ASCII(1967年)

第3章 字符的存儲瀏覽器

 

第1節 ASCII網絡

ASCII(,American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統。它主要用於顯示現代英語,而其擴展版本EASCII則能夠部分支持其餘西歐語言,並等同於國際標準ISO/IEC 646。因爲萬維網使得ASCII廣爲通用,直到2007年12月,逐漸被Unicode取代。工具

美國標準信息交換代碼是由美國國家標準學會(American National Standard Institute , ANSI )制定的,標準的單字節字符編碼方案,用於基於文本的數據。起始於50年代後期,在1967年定案。它最初是美國國家標準,供不一樣計算機在相互通訊時用做共同遵照的西文字符編碼標準,它已被國際標準化組織(International Organization for Standardization, ISO)定爲國際標準,稱爲ISO 646標準。適用於全部拉丁文字字母。編碼

ASCII第一次以規範標準的型態發表是在1967年,最後一次更新則是在1986年,至今爲止共定義了128個字元;其中33個字元沒法顯示(一些終端提供了擴展,使得這些字符可顯示爲諸如笑臉、撲克牌花式等8-bit符號),且這33個字元多數都已經是陳廢的控制字元。控制字元的用途主要是用來操控已經處理過的文字。在33個字元以外的是95個可顯示的字元,包含用鍵盤敲下空白鍵所產生的空白字元也算1個可顯示字元(顯示爲空白)。spa

 

控制字符.net

Unicode表示法:當咱們想在畫面或紙張上表示這些控制字元時,就會顯示成這個樣子。過於老舊的系統或瀏覽器可能會看不到。使用微軟任一中文輸入法,輸入`U2400便可看到␀,輸入`U2401可看到␁,依此類推。設計

脫出字元表示法:一般用於終端機連線(例如Telnet通信協定),以脫出字元^開頭,再接一個符號,用來讓這些控制字元得以在畫面上顯現。雖然看起來是兩個字元,但在終端機上實際只有一個字元。在絕大部分的終端機系統中,包括Windows的命令提示字元(cmd.exe)、Linux和FreeBSD,均可用Ctrl表明脫出字元,輸入想要的ASCII控制字元。例如想輸入空字符,就要輸入Ctrl+2,而非^@,後者會顯示成兩字元,前者只會顯示成一字元。code

 

二進制 十進制 十六進制 縮寫 Unicode表示法 脫出字元表示法 名稱/意義orm

0000 0000 0 00 NUL ␀ ^@ 空字符(Null)blog

0000 0001 1 01 SOH ␁ ^A 標題開始

0000 0010 2 02 STX ␂ ^B 本文開始

0000 0011 3 03 ETX ␃ ^C 本文結束

0000 0100 4 04 EOT ␄ ^D 傳輸結束

0000 0101 5 05 ENQ ␅ ^E 請求

0000 0110 6 06 ACK ␆ ^F 確認迴應

0000 0111 7 07 BEL ␇ ^G 響鈴

0000 1000 8 08 BS ␈ ^H 退格

0000 1001 9 09 HT ␉ ^I 水平定位符號

0000 1010 10 0A LF ␊ ^J 換行鍵

0000 1011 11 0B VT ␋ ^K 垂直定位符號

0000 1100 12 0C FF ␌ ^L 換頁鍵

0000 1101 13 0D CR ␍ ^M Enter鍵

0000 1110 14 0E SO ␎ ^N 取消變換(Shift out)

0000 1111 15 0F SI ␏ ^O 啓用變換(Shift in)

0001 0000 16 10 DLE ␐ ^P 跳出數據通信

0001 0001 17 11 DC1 ␑ ^Q 設備控制一(XON 啓用軟體速度控制)

0001 0010 18 12 DC2 ␒ ^R 設備控制二

0001 0011 19 13 DC3 ␓ ^S 設備控制三(XOFF 停用軟體速度控制)

0001 0100 20 14 DC4 ␔ ^T 設備控制四

0001 0101 21 15 NAK ␕ ^U 確認失敗迴應

0001 0110 22 16 SYN ␖ ^V 同步用暫停

0001 0111 23 17 ETB ␗ ^W 區塊傳輸結束

0001 1000 24 18 CAN ␘ ^X 取消

0001 1001 25 19 EM ␙ ^Y 連線介質中斷

0001 1010 26 1A SUB ␚ ^Z 替換

0001 1011 27 1B ESC ␛ ^[ 退出鍵

0001 1100 28 1C FS ␜ ^\ 文件分割符

0001 1101 29 1D GS ␝ ^] 羣組分隔符

0001 1110 30 1E RS ␞ ^^ 記錄分隔符

0001 1111 31 1F US ␟ ^_ 單元分隔符

0111 1111 127 7F DEL ␡ ^? 刪除

 

可顯示字符

 

缺點

ASCII的侷限在於只能顯示26個基本拉丁字母、阿拉伯數目字和英式標點符號,所以只能用於顯示現代美國英語(並且在處理英語當中的外來詞如naïve、café、élite等等時,全部重音符號都不得不去掉,即便這樣作會違反拼寫規則)。而EASCII雖然解決了部分西歐語言的顯示問題,但對更多其餘語言依然無能爲力。所以如今的軟件系統大多采用Unicode。

 

#include <stdio.h>

 

int main(int argc, char * argv) {

        short idx;

        for (idx = 0; idx <= 0x0FF; idx ++) {

                if (idx % 16 == 0) {

                        printf("\n");

                }

                printf("%c", (char) idx);

        }

 

    return 0;

}

 

 ☺☻♥♦♣

♫☼

►◄↕‼¶§▬↨↑↓→←∟↔▲▼

 !"#$%&'()*+,-./

0123456789:;<=>?

@ABCDEFGHIJKLMNO

PQRSTUVWXYZ[\]^_

`abcdefghijklmno

pqrstuvwxyz{|}~⌂

ÇüéâäàåçêëèïîìÄÅ

ÉæÆôöòûùÿÖÜ¢£¥₧ƒ

áíóúñѪº¿⌐¬½¼¡«»

░▒▓│┤╡╢╖╕╣║╗╝╜╛┐

└┴┬├─┼╞╟╚╔╩╦╠═╬╧

╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀

αßΓπΣσµτΦΘΩδ∞φε∩

≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ 

 

Chcp437

 

Chcp932

 

#include <stdio.h>

 

int to_upper(const char * in, int cnt, char * out) {

        char * p_in = ( char * )in;

        char * p_out = out;

        int i = 0;

        while (p_in != NULL) {

                if (i >= cnt) {

                        break;

                }

                if (*p_in >= 0x61 && *p_in <= 0x7A) {

                        *p_out = (*p_in) - 0x20;

                } else {

                        *p_out = *p_in;

                }

                // printf("@to_upper[%c]=>[%c].\n", *p_in, *p_out);

                p_in++;

                i++;

                p_out++;

        }

        return 0;

}

 

int main(int argc, char * argv) {

        short idx;

        char ch, ch1;

        for (idx = 0; idx <= 0x0FF; idx ++) {

                if (idx % 16 == 0) {

                        printf("\n");

                }

                ch1 = (char) idx;

                to_upper((const char *)&ch1, 1, &ch);

                printf("%c", ch);

        }

 

    return 0;

}

 

‑­

 !"#$%&'()*+,-./

0123456789:;<=>?

@ABCDEFGHIJKLMNO

PQRSTUVWXYZ[\]^_

`ABCDEFGHIJKLMNO

PQRSTUVWXYZ{|}~

€≠ヤ・㊧炎舊克・

髄駐舶沫・圀悃棔

。「」、・ヲァィゥェォャュョッ

ーアイウエオカキクケコサシスセソ

タチツテトナニヌネノハヒフヘホマ

ミムメモヤユヨラリルレロワン゙゚

珮粵蒟跚韜・・ⅰ

涇・

 

#include <stdio.h>

 

int to_upper(const char * in, int cnt, char * out) {

        char * p_in = ( char * )in;

        char * p_out = out;

        int i = 0;

        while (p_in != NULL) {

                if (i >= cnt) {

                        break;

                }

                if (*p_in >= 0x61 && *p_in <= 0x7A) {

                        *p_out = (*p_in) - 0x20;

                } else {

                        *p_out = *p_in;

                }

                // printf("@to_upper[%c]=>[%c].\n", *p_in, *p_out);

                p_in++;

                i++;

                p_out++;

        }

        return 0;

}

 

int to_lower(const char * in, int cnt, char * out) {

        char * p_in = (char *)in;

        char * p_out = out;

        int i = 0;

        while (p_in != NULL) {

                if (i >= cnt) {

                        break;

                }

                if (*p_in >= 0x41 && *p_in <= 0x5A) {

                        *p_out = (*p_in) + 0x20;

                }

                else {

                        *p_out = *p_in;

                }

                // printf("@to_upper[%c]=>[%c].\n", *p_in, *p_out);

                p_in++;

                i++;

                p_out++;

        }

        return 0;

}

 

int main(int argc, char * argv) {

        short idx;

        char ch, ch1;

        for (idx = 0; idx <= 0x0FF; idx ++) {

                if (idx % 16 == 0) {

                        printf("\n");

                }

                ch1 = (char) idx;

                // to_upper((const char *)&ch1, 1, &ch);

                to_lower((const char *)&ch1, 1, &ch);

                printf("%c", ch);

        }

 

    return 0;

}

 

‑­

 !"#$%&'()*+,-./

0123456789:;<=>?

@abcdefghijklmno

pqrstuvwxyz[\]^_

`abcdefghijklmno

pqrstuvwxyz{|}~

€≠ヤ・㊧炎舊克・

髄駐舶沫・圀悃棔

。「」、・ヲァィゥェォャュョッ

ーアイウエオカキクケコサシスセソ

タチツテトナニヌネノハヒフヘホマ

ミムメモヤユヨラリルレロワン゙゚

珮粵蒟跚韜・・ⅰ

涇・

內碼

內碼是指計算機漢字系統中使用的二進制字符編碼,是溝通輸入、輸出與系統平臺之間的交換碼,經過內碼能夠達到通用和高效率傳輸文本的目的。好比MS Word中所存儲和調用的就是內碼而非圖形文字。英文ASCII字符采用一個字節的內碼錶示,中文字符如國標字符集中,GB23十二、GB1234五、GB13000皆用雙字節內碼,GB18030(27,533漢字)雙字節內碼漢字爲20,902個,其他6,631個漢字用四字節內碼。

分類

字符編碼:字符編碼就是以二進制的數字來對應字符集的字符,目前用得最廣泛的字符集是ANSI,對應ANSI字符集的二進制編碼就稱爲ANSI碼,DOS和Windows系統都使用了ANSI碼,但在系統中使用的字符編碼要通過二進制轉換,稱爲系統內碼。

漢字內碼:ANSI碼是單一字節(8位二進制數)的編碼集,最多隻能表示256個字符,不能表示衆多的漢字字符,各個國家和地區在ANSI碼的基礎上又設計了各類不一樣的漢字編碼集,以可以處理大數量的漢字字符。這些編碼使用單字節來表示ANSI的英文字符(即兼容ANSI碼),使用雙字節來表示漢字字符。因爲一個系統中只能有一種漢字內碼,不能識別其它漢字內碼的字符,形成了交流的不便。

GB碼:GB碼是1980年國家公佈的簡體漢字編碼方案,在大陸、新加坡獲得普遍的使用,也稱國標碼。國標碼對6763個漢字集進行了編碼,涵蓋了大多數正在使用的漢字。

GBK碼:GBK碼是GB碼的擴展字符編碼,對多達2萬多的簡繁漢字進行了編碼,簡體版的Win95和Win98都是使用GBK做系統內碼。

BIG5碼:BIG5碼是針對繁體漢字的漢字編碼,在臺灣、香港的電腦系統中獲得廣泛應用。

HZ碼:HZ碼是在Internet上普遍使用的一種漢字編碼。

ISO-2022CJK碼:ISO-2022是國際標準組織(ISO)爲各類語言字符制定的編碼標準。採用二個字節編碼,其中漢語編碼稱ISO-2022 CN,日語、韓語的編碼分別稱JP、KR。通常將三者合稱CJK碼。CJK碼主要在Internet網絡中使用。

Unicode碼:Unicode碼也是一種國際標準編碼,採用二個字節編碼,與ANSI碼不兼容。在網絡、Windows系統和不少大型軟件中獲得應用。

 

內碼轉換

因爲歷史、地區緣由,有時一種文字會出現多種編碼方案,特別是漢字。因爲不一樣於系統內碼的字符不能在該系統中正常顯示,必需要進行字符的內碼轉換,即將非系統內碼的字符轉換爲系統能夠識別的內碼字符。南極星、四通利方、MagicWin9八、兩岸通、漢字通等都是這樣的內碼轉換工具。

 

字符編碼--第3章 字符的存儲--EUC

相關文章
相關標籤/搜索