html
Function/Control Code/Character in ASCII數據庫 Version: 2011-02-15瀏覽器 Author: green-waste (at) 163.com網絡
【什麼是 Function Code 功能碼或 Function Character 功能字符】佈局 ASCII 字符集,你們都知道吧,最基本的包含了 128 個字符。其中前 32 個, 0-31 ,即 0x00-0x1F ,都是不可見字符。這些字符,就叫作控制字符。字體 這些字符無法打印出來,可是每一個字符,都對應着一個特殊的控制功能的字符,簡稱功能字符或功能碼 Function Code 。ui 簡言之: ASCII 中前 32 個字符,統稱爲 Function Code 功能字符。編碼 此外,因爲 ASCII 中的 127 對應的是 Delete ,也是不可見的,因此,此處根據筆者的理解,也能夠歸爲 Function Code 。spa 此類字符,對應不一樣的「功能」,起到必定的「控制做用」,因此,稱爲控制字符。操作系統 關於每一個控制字符的控制功能縮寫,參見下表:
表格 1 ASCII 中的控制字符
注 (*) : 1. 轉義字符:即在 C 語言中或其餘地方如何表示。 2. 用鍵盤輸入控制字符:其中, 32 是空格鍵, 127 是 Delete 鍵,都不須要加 Ctrl 鍵,便可直接輸入。 3. 能夠經過 「Ctrl+ 對應按鍵 」 實現上述控制字符的輸入 , 你可能遇到的一些,好比 : 用 Ctrl+V 輸入 SYNC , Ctrl+M 輸入Enter (固然也能夠直接用 Enter 鍵,可是在 Windows 下面,其可能會發送兩個字符: CR 和 LF ), Ctrl+Q 輸入 XON ,Ctrl+S 輸入 XOFF 等等。
其具體每一個控制字符的含義,詳解介紹以下: 【 ASCII 中的 Function/Control Code 功能字符的詳細含義】
0 – NUL – NUL l 字符 / 空字符 ASCII 字符集中的空字符, NULL ,起初本意能夠看做爲 NOP (中文意爲空操做,就是啥都不作的意思),此位置能夠忽略一個字符。 之因此有這個空字符,主要是用於計算機早期的記錄信息的紙帶,此處留個 NUL 字符,意思是先佔這個位置,以待後用,好比你哪天想起來了,在這個位置在放一個別的啥字符之類的。 後來呢, NUL 字符被用於 C 語言中,字符串的終結符,當一個字符串中間出現 NUL / NULL ,代碼裏面表現爲 /0 ,的時候,就意味着這個是一個字符串的結尾了。這樣就方便按照本身需求去定義字符串,多長都行,固然只要你內存放得下,而後最後加一個 /0, 即空字符,意思是當前字符串到此結束。
1 – SOH – S tart O f H eading 標題開始 若是信息溝通交流主要以命令和消息的形式的話, SOH 就能夠用於標記每一個消息的開始。 1963 年,最開始 ASCII 標準中,把此字符定義爲 Start of Message ,後來又改成如今的 Start Of Heading 。 如今,這個 SOH 常見於主從( master-slave )模式的 RS232 的通訊中,一個主設備,以 SOH 開頭,和從設備進行通訊。這樣方便從設備在數據傳輸出現錯誤的時候,在下一次通訊以前,去實現從新同步( resynchronize )。若是沒有一個清晰的相似於 SOH 這樣的標記,去標記每一個命令的起始或開頭的話,那麼從新同步,就很難實現了。
2 – STX – S tart O f T ext 文本開始 3 – ETX – E nd Of T ext 文本結束 經過某種通信協議去傳輸的一個數據(包),稱爲一幀的話,常會包含一個幀頭,包含了尋址信息,即你是要發給誰,要發送到目的地是哪裏,其後跟着真正要發送的數據內容。 而 STX ,就用於標記這個數據內容的開始。接下來是要傳輸的數據,最後是 ETX ,代表數據的結束。 其中,中間具體傳輸的數據內容, ASCII 規範並無去定義,其和你所用的傳輸協議,具體本身要傳什麼數據有關。
不過其中有趣的是, 1963 年, ASCII 標準最第一版本的時候,把如今的 STX 叫作 EOA ( End Of Address ), ETX 叫作(End Of Message )。這是由於,最先的時候,一個消息中,老是包含一個開始符和一個終止符。如今的新的定義,使得能夠去發送一個固定長度的命令,而只用一個 SOH 代表幀頭開始便可,而不須要再加上一個命令終止符或幀頭結束符。
總結一下: 通常發送一個消息,包含了一個幀頭和後面真正要傳的數據。 而對於幀頭,屬於控制類的信息,這部分以前屬於命令,後面的真實要傳的數據屬於數據。即消息 = 幀頭 + 數據。 而以前的命令都要有個開始符和結束符,這樣就是: 消息 = 幀頭 + 要傳的數據 = 幀頭開始 + 幀頭信息 + 幀頭結束 + 要傳的數據 而如今新的定義,使得只須要: 消息 = 幀頭 + 要傳的數據 = SOH (代表幀頭開始) + 幀頭信息 + 要傳的數據 = SOH (代表幀頭開始) + 幀頭信息 + STX + 數據內容 +ETX 就能夠少用一個幀頭結束符。
而現在,在不少協議中,也常見到,一個固定長度的幀頭,後面緊接着就是數據了,而沒有所謂的幀頭結束符之類的東西去區分幀頭和數據。
4 – EOT – E nd O f T ransmission 傳輸結束 5 – ENQ – ENQ uiry 請求 6 – ACK – ACK nowledgment 迴應 / 響應 7 – BEL – [audible] BEL l
在 ASCII 字符集中, BEL ,是個比較有意思的東東。由於其原先本意不是用來數據編碼的,於此相反, ASCII 中的其餘字符,都是用於字符編碼(即用什麼字符,表明什麼含義)或者起到控制設備的做用。 BEL 用一個能夠聽得見的聲音,來吸引人們的注意,其原打算即用於計算機也用於一些設備,好比打印機等。 C 語言裏面也支持此 BEL ,用 /a 來實現這個響鈴。
8 – BS – B ackS pace 退格鍵 退格鍵的功能,隨着時間變化,意義也變得不一樣了。 起初,意思是,在打印機和電傳打字機上,往回移動一格光標,以起到強調該字符的做用。好比你想要打印一個 a ,而後加上退格鍵後,就成了 aBS^ 。在機械類打字機上,此方法可以起到實際的強調字符的做用,可是對於後來的 CTR 下時期來講,就沒法起到對應效果了。 而現代所用的退格鍵,不只僅表示光標往回移動了一格,同時也刪除了移動後該位置的字符。在 C 語言中,退格鍵能夠用/b 表示。
9 – HT – H orizontal T ab 水平製表符 ASCII 中的 HT 控制符的做用是用於佈局的。 其控制輸出設備前進到下一個表格去處理。而製表符 Table/Tab 的寬度也是靈活不固定的,只不過,多數設備上,製表符Tab 的寬度都預約義爲 8 。水平製表符 HT 不只能減小數據輸入者的工做量,對於格式化好的文字來講,還可以減小存儲空間,由於一個 Tab 鍵,就代替了 8 個空格,因此說省空間。 對於省空間的優勢,咱們如今來看,可能會以爲好笑,由於如今存儲空間已足夠大,通常來講根本不會須要去省那麼點可憐的存儲空間,可是實際上在計算機剛發明的時候,存儲空間(主要指的是內存)極其有限也極其昂貴,並且像 ZIP 等壓縮方法也還沒發明呢,因此對於當時來講,對於存儲空間,那是可以省一點是一點,省任何一點,都是好的,也都是不容易的,省空間就是省錢啊。 C 語言中,用 /t 表示製表符。
10 – LF – L ine F eed 換行 LF ,直譯爲(給打印機等)喂一行,意思就是所說的,換行。 換行字符,是 ASCII 字符集中,被誤用的字符中的其中一個。 LF 的最原始的含義是,移動打印機的頭到下一行。而另一個 ASCII 字符, CR ( Carriage Return )纔是將打印機的頭,移到最左邊即一行的開始,行首。不少串口協議和 MS-DOS 及 Windows 操做系統,也都是這麼實現的。 而於此不一樣,對於 C 語言和 Unix 操做系統,其從新定義了 LF 字符的含義爲新行,即 LF 和 CR 的組合才能表達出的,回車且換行的意思。 雖然你能夠爭論哪一種用法是錯的,可是,不能否認,是從程序的角度出發, C 語言和 Unix 對此 LF 的含義實現顯得就很天然,而 MS-DOS 的實現更接近於 LF 的本意。 若是最開始 ASCII 標準中,及定義 CF 也定義 newline ,那樣意思會清楚,會更好理理解: LF 表示物理上的,設備控制方面的移動到下一行(並無移動到行首); 新行( newline )表示邏輯上文本分隔符,即回車換行。 不過呢,如今人們常將 LF 用作 newline 新行的功能,而大多數文本編輯軟件也均可以處理單個 LF 或者 CR/LF 的組合了。 LF 在 C 語言中,用 /n 表示。
11 – VT – V ertical T ab 垂直製表符 垂直製表符,相似於水平製表符 Tab ,目的是爲了減小布局中的工做,同時也減小了格式化字符時所須要存儲字符的空間。 VT 控制碼用於跳到下一個標記行。說實話,還真沒看到有些地方須要用這個 VT 呢,由於通常在換行的時候,都是用 LF 代替 VT 了。
12 – FF – F orm F eed 換頁 設計換頁鍵,是用來控制打印機行爲的。當打印機收到此鍵碼的時候,打印機移動到下一頁。不一樣的設備的終端對此控制碼所表現的行爲各不一樣。有些會去清除屏幕,而其餘有的只是顯示 ^L 字符或者是隻是新換一行而已。 Shell 腳本程序Bash 和 Tcsh 的實現方式是,把 FF 看做是一個清除屏幕的命令。 C 語言程序中用 /f 表示 FF (換頁)。
13 – CR – Carriage return 機器的滑動部分 / 底座 返回 -> 回車 CR 回車的原意是讓打印頭回到左邊界,並無移動到下一行。 隨着時間流逝,後來人把 CR 的意思弄成了 Enter 鍵,用於示意輸入完畢。在數據以屏幕顯示的狀況下,人們在 Enter 的同時,也但願把光標移動到下一行。所以 C 語言和 Unix 操做系統,從新定義了 LF 的意思,使其表示爲移動到下一行。當輸入 CR 去存儲數據的時候,軟件也經常隱式地將其轉換爲 LF 。
14 – SO – S hift O ut 不用切換 15 – SI – S hift I n 啓用切換 早在 1960s 年代,定義 ASCII 字符集的人,就已經懂得了,設計字符集不僅僅能夠用於英文字符集,也要能應用於外文字符集,是很重要的。 定義 Shift In 和 Shift Out 的含義,即考慮到了此點。 最開始,其意爲在西里爾語和拉丁語之間切換。西里爾 ASCII 定義中, KOI-7 用到了 Shift 字符。拉丁語用 Shift 去改變打印機的字體。在此種用途中, SO 用於產生雙倍寬度的字符,而用 SI 打印壓縮的字體。
16 – DLE – D ata L ink E scape 數據鏈路轉義 有時候,咱們須要在正在進行的通訊過程當中去發送一些控制字符。可是,總有一些狀況下,這些控制字符卻被當作了普通的數據流,而沒有起到對應的控制效果。而 ASCII 標準中,定義 DLE 來解決這類問題。 若是數據流中檢測到了 DLE ,數據接收端則對其後面接下來的數據流中的字符,另做處理。而關於具體如何處理這些字符, ASCII 規範中則沒有具體定義,而只是弄了個 DLE 去打斷正常數據的處理,告訴接下來的數據,要特殊對待。根據Modem 中的 Hayes 通訊協議 DLE 定義爲「無聲 +++ 無聲」。以個人觀點,這樣可能會更好:若是 Hayes 協議沒有把DLE 處理爲嵌入通信的無聲狀態,那樣就符合現存的標準了。然而 Hayes 的開發者卻以爲 +++ 用的頻率要遠高於原始的DLE ,因此才這麼定義了。
17 – DC1 – D evice C ontrol 1 / XON – Transmission on 這個 ASCII 控制字符儘管原先定義爲 DC1 , 可是如今常表示爲 XON ,用於串行通訊中的軟件流控制。其主要做用爲,在通訊被控制碼 XOFF 中斷以後,從新開始信息傳輸。用過串行終端的人應該還記得,當有時候數據出錯了,按 Ctrl+Q(等價於 XON )有時候能夠起到從新傳輸的效果。這是由於,此 Ctrl+Q 鍵盤序列實際上就是產生 XON 控制碼,其能夠將那些因爲終端或者主機方面,因爲偶爾出現的錯誤的 XOFF 控制碼而中斷的通訊解鎖,使其正常通訊。
18 – DC2 – D evice C ontrol 2 19 – DC3 – D evice C ontrol 3 / XOFF – Transmission off 傳輸中斷 20 – DC4 – D evice C ontrol 4 21 – NAK – N egative A cK nowledgment 負面響應 -> 無響應 , 非正常響應 22 – SYN – SYN chronous idle 23 – ETB – E nd of T ransmission B lock 塊傳輸停止 24 – CAN – CAN cel 取消 25 – EM – E nd of M edium 已到介質末端,介質存儲已滿 EM 用於,當數據存儲到達串行存儲介質末尾的時候,就像磁帶或磁頭滾動到介質末尾同樣。其用於表述數據的邏輯終點,即沒必要非要是物理上的達到數據載體的末尾。
26 – SUB – SUB stitute character 替補 / 替換 27 – ESC – ESC ape 逃離 / 取消 字符 Escape ,是 ASCII 標準的獨創的,由 Bob Bemer 提議的。用於開始一段控制碼的擴展字符。如此,便可以沒必要將全部可能想獲得的字符都放到 ASCII 標準中了。由於,新的技術可能須要新的控制命令,而 ESC 能夠用做這些字符命令的起始標誌。 ESC 普遍用於打印機和終端,去控制設備設置,好比字體,字符位置和顏色等等。若是最開始的 ASCII 標準中,沒有定義 ESC ,估計 ASCII 標準早就被其餘標準所替代了,由於其沒有包含這些新出現的字符,因此確定會有其餘新的標準出現,用於表示這些字符的。即, ESC 給開發者提供了,能夠根據須要而定義新含義的字符的可能。
28 – FS – F ile S eparator 文件分隔符 文件分隔符是個頗有意思的控制字符,由於其可讓咱們看到 1960s 年代的時候,計算機技術是如何組織的。咱們如今,習慣於隨即訪問一些存儲介質,好比 RAM ,磁盤,可是在定義 ASCII 標 準的那個年代,大部分數據仍是順序的,串行的,而不是隨機訪問的。此處所說的串行的,不只僅指的是串行通訊,還指的是順序存儲介質,好比穿孔卡片,紙帶, 磁帶等。在串行通訊的時代,設計這麼一個用於表示文件分隔符的控制字符,用於分割兩個單獨的文件,是一件很明智的事情。而 FS 的緣由就在於此。
29 – GS – G roup S eparator 分組符 ASCII 定義控制字符的緣由中,其中一條就是考慮到了數據存儲方面的狀況。大部分狀況下,數據庫的創建,都和表有關,包含了對應的記錄。同一個表中的全部的記錄,屬於同一類型。不一樣的表中的記錄,屬於對應的不一樣的類型。而分組符 GS 就是用來分隔串行數據存儲系統中的不一樣的組。值得注意的是,當時尚未使用 word 的表格,當時 ASCII 時代的人,把他叫作組。
30 – RS – R ecord S eparator 記錄分隔符 記錄分隔符 RS 用於分隔在一個組或表內的多個記錄。
31 – US – U nit S eparator 單元分隔符 在 ASCII 定義中,在數據庫中所存儲的,最小的數據項,叫作 Unit 單元。而如今咱們稱其 field 域。單元分隔符 US 用於分割串行數據存儲環境下的不一樣的域。 如今大部分的數據庫實現,要求大部分類型都擁有固定的長度。 儘管大部分時候可能用不到,可是對於每個域,卻都要分配足夠大的空間,用於存放最大可能的成員變量。這樣的作法,佔用了大量的存儲空間,而 US 控制碼容許域具備可變的長度。在 1960s 年代,數據存儲空間頗有限,用 US 這個單元分隔符,將不一樣單元分隔開,這樣就能夠實現更高效地存儲那些寶貴的數據。另外一方面,串行存儲的存儲效率,遠低於RAM 和磁盤中所實現的表格存儲。我我的沒法想象,若是如今的數據,仍是存儲在自帶或者帶滾輪的磁帶上,會是何種景象。
32 – SP – White SP ace 空格鍵 也許你會爭論說,空格鍵是否真的能算是一個控制字符?由於如今在普通文字中使用空格鍵是如此常見。 可是,既然水平製表符和退格鍵在 ASCII 中, 都被叫作控制字符了,那麼我以爲也很天然地,能夠把空格鍵(向前的空格)也叫作控制字符,畢竟,其自己並不表明一個真正的可見的字符,而僅僅只是很經常使用於 輸出設備,用於處理位置前向移動一格,清除當前位置的內容而已。在不少程序中,好比字符處理程序,白空格一樣可能從致使行尾轉到下一行行首,而網絡瀏覽器 將多個空格組合成單個空格輸出。 因此,這更加堅決了個人想法,以爲徹底能夠把空格當作是一個控制字符,而不只僅是一個很獨特的普通字符。
127 – DEL – DEL ete 刪除 有人也許會問,爲什麼 ASCII 字符集中的控制字符的值都是很小的,即 0-32 ,而 DEL 控制字符的值卻很大,是 127 。這是因爲這個特殊的字符是爲紙帶而定義的。而在那個時候,絕大多數的紙帶,都是用 7 個孔洞去編碼數據的。而 127 這個值所對應的二進制值爲 111 1111b ,表示全部 7 個比特位都是高,因此,將 DEL 用在現存的紙帶上時,全部的洞就都被穿孔了,就把已經存在的數據都擦出掉了,就起到了對應的刪除的做用了。
【引用】 http://www.lammertbies.nl/comm/info/ascii-characters.html
2 . 百度百科: ASCII http://baike.baidu.com/view/15482.htm
3. ASCII 編碼表 |