ASCII码不可见字符过滤处理
Function/Control Code/Character in ASCII
Version: 2011-02-15
Author: green-waste (at) 163.com
【什么是?Function Code?功能碼或??Function Character?功能字符】
ASCII?字符集,大家都知道吧,最基本的包含了?128?個(gè)字符。其中前?32?個(gè),?0-31?,即?0x00-0x1F?,都是不可見(jiàn)字符。這些字符,就叫做控制字符。
這些字符沒(méi)法打印出來(lái),但是每個(gè)字符,都對(duì)應(yīng)著一個(gè)特殊的控制功能的字符,簡(jiǎn)稱(chēng)功能字符或功能碼?Function Code?。
簡(jiǎn)言之:?ASCII?中前?32?個(gè)字符,統(tǒng)稱(chēng)為?Function Code?功能字符。
此外,由于?ASCII?中的?127?對(duì)應(yīng)的是?Delete?,也是不可見(jiàn)的,所以,此處根據(jù)筆者的理解,也可以歸為?Function Code?。
此類(lèi)字符,對(duì)應(yīng)不同的“功能”,起到一定的“控制作用”,所以,稱(chēng)為控制字符。
關(guān)于每個(gè)控制字符的控制功能縮寫(xiě),參見(jiàn)下表:
?
表格??1????ASCII?中的控制字符
十 進(jìn)制 | 十六 進(jìn)制 | 控制 字符 | 轉(zhuǎn)義 字符?* | 說(shuō)明 | Ctrl + 下列字母??* |
0 | 00 | NUL | /0 | Null character(?空字符?) | @ (Shift + 2) |
1 | 01 | SOH | ? | Start of Header(?標(biāo)題開(kāi)始?) | A |
2 | 02 | STX | ? | Start of Text(?正文開(kāi)始?) | B |
3 | 03 | ETX | ? | End of Text(?正文結(jié)束?) | C |
4 | 04 | EOT | ? | End of Transmission(?傳輸結(jié)束?) | D |
5 | 05 | ENQ | ? | Enquiry(?請(qǐng)求?) | E |
6 | 06 | ACK | ? | Acknowledgment(?收到通知?/?響應(yīng)?) | F |
7 | 07 | BEL | /a | Bell?(?響鈴?) | G |
8 | 08 | BS | /b | Backspace(?退格?) | H |
9 | 09 | HT | /t | Horizontal Tab(?水平制表符?) | I |
10 | 0A | LF | /n | Line feed(?換行鍵?) | J |
11 | 0B | VT | /v | Vertical Tab(?垂直制表符?) | K |
12 | 0C | FF | /f | Form feed(?換頁(yè)鍵?) | L |
13 | 0D | CR | /r | Carriage return(?回車(chē)鍵?) | M |
14 | 0E | SO | ? | Shift Out(?不用切換?) | N |
15 | 0F | SI | ? | Shift In(?啟用切換?) | O |
16 | 10 | DLE | ? | Data Link Escape(?數(shù)據(jù)鏈路轉(zhuǎn)義?) | P |
17 | 11 | DC1 | ? | Device Control 1(?設(shè)備控制?1) /XON(Transmit On) | Q |
18 | 12 | DC2 | ? | Device Control 2(?設(shè)備控制?2) | R |
19 | 13 | DC3 | ? | Device Control 3(?設(shè)備控制?3) /XOFF(Transmit Off) | S |
20 | 14 | DC4 | ? | Device Control 4(?設(shè)備控制?4) | T |
21 | 15 | NAK | ? | Negative Acknowledgement(?拒絕接收?/?無(wú)響應(yīng)?) | U |
22 | 16 | SYN | ? | Synchronous Idle(?同步空閑?) | V |
23 | 17 | ETB | ? | End of Trans the Block(?傳輸塊結(jié)束?) | W |
24 | 18 | CAN | ? | Cancel(?取消?) | X |
25 | 19 | EM | ? | End of Medium(?已到介質(zhì)末端?/?介質(zhì)存儲(chǔ)已滿?) | Y |
26 | 1A | SUB | ? | Substitute(?替補(bǔ)?/?替換?) | Z |
27 | 1B | ESC | /e | Escape(?溢出?/?逃離?/?取消?) | [ |
28 | 1C | FS | ? | File Separator(?文件分割符?) | / |
29 | 1D | GS | ? | Group Separator(?分組符?) | ] |
30 | 1E | RS | ? | Record Separator(?記錄分隔符?) | ^ (Shit + 6) |
31 | 1F | US | ? | Unit Separator(?單元分隔符?) | _ (Shift + -) |
32 | 20 | SP | ? | White space | [Space] * |
127 | 7F | DEL | ? | Delete(?刪除?) | [Delete] * |
注?(*)?:
1.??轉(zhuǎn)義字符:即在?C?語(yǔ)言中或其他地方如何表示。
2.??用鍵盤(pán)輸入控制字符:其中,?32?是空格鍵,?127?是?Delete?鍵,都不需要加?Ctrl?鍵,即可直接輸入。
3.??可以通過(guò)??“Ctrl+?對(duì)應(yīng)按鍵?”?實(shí)現(xiàn)上述控制字符的輸入?,??你可能遇到的一些,比如?:?用?Ctrl+V?輸入?SYNC?,?Ctrl+M?輸入Enter?(當(dāng)然也可以直接用?Enter?鍵,但是在?Windows?下面,其可能會(huì)發(fā)送兩個(gè)字符:?CR?和?LF?),?Ctrl+Q?輸入?XON?,Ctrl+S?輸入?XOFF?等等。
?【過(guò)濾處理】
在Qt中,QChar有一個(gè)函數(shù)是isPrint(),判斷是否為打印字符,可以直接使用
?
其具體每個(gè)控制字符的含義,詳解介紹如下:
【?ASCII?中的?Function/Control Code?功能字符的詳細(xì)含義】
?
0 – NUL –?NUL?l??字符?/?空字符
ASCII?字符集中的空字符,?NULL?,起初本意可以看作為?NOP?(中文意為空操作,就是啥都不做的意思),此位置可以忽略一個(gè)字符。
之所以有這個(gè)空字符,主要是用于計(jì)算機(jī)早期的記錄信息的紙帶,此處留個(gè)?NUL?字符,意思是先占這個(gè)位置,以待后用,比如你哪天想起來(lái)了,在這個(gè)位置在放一個(gè)別的啥字符之類(lèi)的。
后來(lái)呢,?NUL?字符被用于?C?語(yǔ)言中,字符串的終結(jié)符,當(dāng)一個(gè)字符串中間出現(xiàn)?NUL / NULL?,代碼里面表現(xiàn)為?/0?,的時(shí)候,就意味著這個(gè)是一個(gè)字符串的結(jié)尾了。這樣就方便按照自己需求去定義字符串,多長(zhǎng)都行,當(dāng)然只要你內(nèi)存放得下,然后最后加一個(gè)?/0,??即空字符,意思是當(dāng)前字符串到此結(jié)束。
?
1 – SOH –?S?tart???O?f?H?eading??標(biāo)題開(kāi)始
如果信息溝通交流主要以命令和消息的形式的話,?SOH?就可以用于標(biāo)記每個(gè)消息的開(kāi)始。
1963?年,最開(kāi)始?ASCII?標(biāo)準(zhǔn)中,把此字符定義為?Start of Message?,后來(lái)又改為現(xiàn)在的?Start Of Heading?。
現(xiàn)在,這個(gè)?SOH?常見(jiàn)于主從(?master-slave?)模式的?RS232?的通信中,一個(gè)主設(shè)備,以?SOH?開(kāi)頭,和從設(shè)備進(jìn)行通信。這樣方便從設(shè)備在數(shù)據(jù)傳輸出現(xiàn)錯(cuò)誤的時(shí)候,在下一次通信之前,去實(shí)現(xiàn)重新同步(?resynchronize?)。如果沒(méi)有一個(gè)清晰的類(lèi)似于?SOH?這樣的標(biāo)記,去標(biāo)記每個(gè)命令的起始或開(kāi)頭的話,那么重新同步,就很難實(shí)現(xiàn)了。
?
2 – STX –?S?tart?O?f?T?ext??文本開(kāi)始
3 – ETX –?E?nd Of?T?ext??文本結(jié)束
通過(guò)某種通訊協(xié)議去傳輸?shù)囊粋€(gè)數(shù)據(jù)(包),稱(chēng)為一幀的話,常會(huì)包含一個(gè)幀頭,包含了尋址信息,即你是要發(fā)給誰(shuí),要發(fā)送到目的地是哪里,其后跟著真正要發(fā)送的數(shù)據(jù)內(nèi)容。
而?STX?,就用于標(biāo)記這個(gè)數(shù)據(jù)內(nèi)容的開(kāi)始。接下來(lái)是要傳輸?shù)臄?shù)據(jù),最后是?ETX?,表明數(shù)據(jù)的結(jié)束。
其中,中間具體傳輸?shù)臄?shù)據(jù)內(nèi)容,?ASCII?規(guī)范并沒(méi)有去定義,其和你所用的傳輸協(xié)議,具體自己要傳什么數(shù)據(jù)有關(guān)。
?
幀頭 | 數(shù)據(jù)或文本內(nèi)容 | ? | ? | |
SOH(表明幀頭開(kāi)始) | 。。。。(幀頭信息,比如包含了目的地址,表明你發(fā)送給誰(shuí)等等) | STX?(表明數(shù)據(jù)開(kāi)始) | 。。。(真正要傳輸?shù)臄?shù)據(jù)) | ETX?(表明數(shù)據(jù)結(jié)束) |
| ? | ? | ? | ? | ? |
?
?
不過(guò)其中有趣的是,?1963?年,?ASCII?標(biāo)準(zhǔn)最初版本的時(shí)候,把現(xiàn)在的?STX?叫做?EOA?(?End Of Address?),?ETX?叫做(End Of Message?)。這是因?yàn)?#xff0c;最早的時(shí)候,一個(gè)消息中,總是包含一個(gè)開(kāi)始符和一個(gè)終止符。現(xiàn)在的新的定義,使得可以去發(fā)送一個(gè)固定長(zhǎng)度的命令,而只用一個(gè)?SOH?表明幀頭開(kāi)始即可,而不需要再加上一個(gè)命令終止符或幀頭結(jié)束符。
?
總結(jié)一下:
一般發(fā)送一個(gè)消息,包含了一個(gè)幀頭和后面真正要傳的數(shù)據(jù)。
而對(duì)于幀頭,屬于控制類(lèi)的信息,這部分之前屬于命令,后面的真實(shí)要傳的數(shù)據(jù)屬于數(shù)據(jù)。即消息?=?幀頭?+?數(shù)據(jù)。
而之前的命令都要有個(gè)開(kāi)始符和結(jié)束符,這樣就是:
消息????????=??幀頭????????????????????????????????+??要傳的數(shù)據(jù)
=??幀頭開(kāi)始?+?幀頭信息?+?幀頭結(jié)束?????????+??要傳的數(shù)據(jù)
而現(xiàn)在新的定義,使得只需要:
消息????????=??幀頭??+?要傳的數(shù)據(jù)
= SOH?(表明幀頭開(kāi)始)?+?幀頭信息?????+??要傳的數(shù)據(jù)
= SOH?(表明幀頭開(kāi)始)?+?幀頭信息?????+ STX +??數(shù)據(jù)內(nèi)容?+ETX
就可以少用一個(gè)幀頭結(jié)束符。
?
而如今,在很多協(xié)議中,也常見(jiàn)到,一個(gè)固定長(zhǎng)度的幀頭,后面緊接著就是數(shù)據(jù)了,而沒(méi)有所謂的幀頭結(jié)束符之類(lèi)的東西去區(qū)分幀頭和數(shù)據(jù)。
?
4 – EOT –?E?nd?O?f?T?ransmission??傳輸結(jié)束
5 – ENQ –?ENQ?uiry??請(qǐng)求
6 – ACK –?ACK?nowledgment??回應(yīng)?/?響應(yīng)
7 – BEL – [audible]?BEL?l
?
在?ASCII?字符集中,?BEL?,是個(gè)比較有意思的東東。因?yàn)槠湓缺疽獠皇怯脕?lái)數(shù)據(jù)編碼的,于此相反,?ASCII?中的其他字符,都是用于字符編碼(即用什么字符,代表什么含義)或者起到控制設(shè)備的作用。?BEL?用一個(gè)可以聽(tīng)得見(jiàn)的聲音,來(lái)吸引人們的注意,其原打算即用于計(jì)算機(jī)也用于一些設(shè)備,比如打印機(jī)等。?C?語(yǔ)言里面也支持此?BEL?,用?/a?來(lái)實(shí)現(xiàn)這個(gè)響鈴。
?
8 – BS –?B?ackS?pace??退格鍵
退格鍵的功能,隨著時(shí)間變化,意義也變得不同了。
起初,意思是,在打印機(jī)和電傳打字機(jī)上,往回移動(dòng)一格光標(biāo),以起到強(qiáng)調(diào)該字符的作用。比如你想要打印一個(gè)?a?,然后加上退格鍵后,就成了?aBS^?。在機(jī)械類(lèi)打字機(jī)上,此方法能夠起到實(shí)際的強(qiáng)調(diào)字符的作用,但是對(duì)于后來(lái)的?CTR?下時(shí)期來(lái)說(shuō),就無(wú)法起到對(duì)應(yīng)效果了。
而現(xiàn)代所用的退格鍵,不僅僅表示光標(biāo)往回移動(dòng)了一格,同時(shí)也刪除了移動(dòng)后該位置的字符。在?C?語(yǔ)言中,退格鍵可以用/b?表示。
?
9 – HT –?H?orizontal?T?ab??水平制表符
ASCII?中的?HT?控制符的作用是用于布局的。
其控制輸出設(shè)備前進(jìn)到下一個(gè)表格去處理。而制表符?Table/Tab?的寬度也是靈活不固定的,只不過(guò),多數(shù)設(shè)備上,制表符Tab?的寬度都預(yù)定義為?8?。水平制表符?HT?不僅能減少數(shù)據(jù)輸入者的工作量,對(duì)于格式化好的文字來(lái)說(shuō),還能夠減少存儲(chǔ)空間,因?yàn)橐粋€(gè)?Tab?鍵,就代替了?8?個(gè)空格,所以說(shuō)省空間。
對(duì)于省空間的優(yōu)點(diǎn),我們現(xiàn)在來(lái)看,可能會(huì)覺(jué)得可笑,因?yàn)楝F(xiàn)在存儲(chǔ)空間已足夠大,一般來(lái)說(shuō)根本不會(huì)需要去省那么點(diǎn)可憐的存儲(chǔ)空間,但是實(shí)際上在計(jì)算機(jī)剛發(fā)明的時(shí)候,存儲(chǔ)空間(主要指的是內(nèi)存)極其有限也極其昂貴,而且像?ZIP?等壓縮方法也還沒(méi)發(fā)明呢,所以對(duì)于當(dāng)時(shí)來(lái)說(shuō),對(duì)于存儲(chǔ)空間,那是能夠省一點(diǎn)是一點(diǎn),省任何一點(diǎn),都是好的,也都是不容易的,省空間就是省錢(qián)啊。
C?語(yǔ)言中,用?/t?表示制表符。
?
10 – LF –?L?ine?F?eed??換行
LF?,直譯為(給打印機(jī)等)喂一行,意思就是所說(shuō)的,換行。
換行字符,是?ASCII?字符集中,被誤用的字符中的其中一個(gè)。
LF?的最原始的含義是,移動(dòng)打印機(jī)的頭到下一行。而另外一個(gè)?ASCII?字符,?CR?(?Carriage Return?)才是將打印機(jī)的頭,移到最左邊即一行的開(kāi)始,行首。很多串口協(xié)議和?MS-DOS?及?Windows?操作系統(tǒng),也都是這么實(shí)現(xiàn)的。
而于此不同,對(duì)于?C?語(yǔ)言和?Unix?操作系統(tǒng),其重新定義了?LF?字符的含義為新行,即?LF?和?CR?的組合才能表達(dá)出的,回車(chē)且換行的意思。
雖然你可以爭(zhēng)論哪種用法是錯(cuò)的,但是,不可否認(rèn),是從程序的角度出發(fā),?C?語(yǔ)言和?Unix?對(duì)此?LF?的含義實(shí)現(xiàn)顯得就很自然,而?MS-DOS?的實(shí)現(xiàn)更接近于?LF?的本意。
如果最開(kāi)始?ASCII?標(biāo)準(zhǔn)中,及定義??CF?也定義?newline?,那樣意思會(huì)清楚,會(huì)更好理理解:
LF?表示物理上的,設(shè)備控制方面的移動(dòng)到下一行(并沒(méi)有移動(dòng)到行首);
新行(?newline?)表示邏輯上文本分隔符,即回車(chē)換行。
不過(guò)呢,現(xiàn)在人們常將?LF?用做?newline?新行的功能,而大多數(shù)文本編輯軟件也都可以處理單個(gè)?LF?或者?CR/LF?的組合了。
LF?在?C?語(yǔ)言中,用?/n?表示。
?
11 – VT –?V?ertical?T?ab??垂直制表符
垂直制表符,類(lèi)似于水平制表符?Tab?,目的是為了減少布局中的工作,同時(shí)也減少了格式化字符時(shí)所需要存儲(chǔ)字符的空間。?VT?控制碼用于跳到下一個(gè)標(biāo)記行。說(shuō)實(shí)話,還真沒(méi)看到有些地方需要用這個(gè)?VT?呢,因?yàn)橐话阍趽Q行的時(shí)候,都是用?LF?代替?VT?了。
?
12 – FF –?F?orm?F?eed???換頁(yè)
設(shè)計(jì)換頁(yè)鍵,是用來(lái)控制打印機(jī)行為的。當(dāng)打印機(jī)收到此鍵碼的時(shí)候,打印機(jī)移動(dòng)到下一頁(yè)。不同的設(shè)備的終端對(duì)此控制碼所表現(xiàn)的行為各不同。有些會(huì)去清除屏幕,而其他有的只是顯示?^L?字符或者是只是新?lián)Q一行而已。?Shell?腳本程序Bash?和?Tcsh?的實(shí)現(xiàn)方式是,把?FF?看作是一個(gè)清除屏幕的命令。?C?語(yǔ)言程序中用?/f?表示?FF?(換頁(yè))。
?
13 – CR – Carriage return??機(jī)器的滑動(dòng)部分?/?底座???返回??->??回車(chē)
CR?回車(chē)的原意是讓打印頭回到左邊界,并沒(méi)有移動(dòng)到下一行。
隨著時(shí)間流逝,后來(lái)人把?CR?的意思弄成了?Enter?鍵,用于示意輸入完畢。在數(shù)據(jù)以屏幕顯示的情況下,人們?cè)?/span>?Enter?的同時(shí),也希望把光標(biāo)移動(dòng)到下一行。因此?C?語(yǔ)言和?Unix?操作系統(tǒng),重新定義了?LF?的意思,使其表示為移動(dòng)到下一行。當(dāng)輸入?CR?去存儲(chǔ)數(shù)據(jù)的時(shí)候,軟件也常常隱式地將其轉(zhuǎn)換為?LF?。
?
14 – SO –?S?hift?O?ut??不用切換
15 – SI –?S?hift?I?n???啟用切換
早在?1960s?年代,定義?ASCII?字符集的人,就已經(jīng)懂得了,設(shè)計(jì)字符集不單單可以用于英文字符集,也要能應(yīng)用于外文字符集,是很重要的。
定義?Shift In??和?Shift Out?的含義,即考慮到了此點(diǎn)。
最開(kāi)始,其意為在西里爾語(yǔ)和拉丁語(yǔ)之間切換。西里爾?ASCII?定義中,?KOI-7?用到了?Shift?字符。拉丁語(yǔ)用?Shift?去改變打印機(jī)的字體。在此種用途中,?SO?用于產(chǎn)生雙倍寬度的字符,而用?SI?打印壓縮的字體。
?
16 – DLE –?D?ata?L?ink?E?scape??數(shù)據(jù)鏈路轉(zhuǎn)義
有時(shí)候,我們需要在正在進(jìn)行的通信過(guò)程中去發(fā)送一些控制字符。但是,總有一些情況下,這些控制字符卻被看成了普通的數(shù)據(jù)流,而沒(méi)有起到對(duì)應(yīng)的控制效果。而?ASCII?標(biāo)準(zhǔn)中,定義?DLE?來(lái)解決這類(lèi)問(wèn)題。
如果數(shù)據(jù)流中檢測(cè)到了?DLE?,數(shù)據(jù)接收端則對(duì)其后面接下來(lái)的數(shù)據(jù)流中的字符,另作處理。而關(guān)于具體如何處理這些字符,?ASCII?規(guī)范中則沒(méi)有具體定義,而只是弄了個(gè)?DLE?去打斷正常數(shù)據(jù)的處理,告訴接下來(lái)的數(shù)據(jù),要特殊對(duì)待。根據(jù)Modem?中的?Hayes?通信協(xié)議?DLE?定義為“無(wú)聲?+++?無(wú)聲”。以我的觀點(diǎn),這樣可能會(huì)更好:如果?Hayes?協(xié)議沒(méi)有把DLE?處理為嵌入通訊的無(wú)聲狀態(tài),那樣就符合現(xiàn)存的標(biāo)準(zhǔn)了。然而?Hayes?的開(kāi)發(fā)者卻覺(jué)得?+++?用的頻率要遠(yuǎn)高于原始的DLE?,所以才這么定義了。
?
17 – DC1 –?D?evice?C?ontrol 1 / XON – Transmission on
這個(gè)?ASCII?控制字符盡管原先定義為?DC1?,???但是現(xiàn)在常表示為?XON?,用于串行通信中的軟件流控制。其主要作用為,在通信被控制碼?XOFF?中斷之后,重新開(kāi)始信息傳輸。用過(guò)串行終端的人應(yīng)該還記得,當(dāng)有時(shí)候數(shù)據(jù)出錯(cuò)了,按?Ctrl+Q(等價(jià)于?XON?)有時(shí)候可以起到重新傳輸?shù)男Ч_@是因?yàn)?#xff0c;此?Ctrl+Q?鍵盤(pán)序列實(shí)際上就是產(chǎn)生?XON?控制碼,其可以將那些由于終端或者主機(jī)方面,由于偶爾出現(xiàn)的錯(cuò)誤的?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??負(fù)面響應(yīng)?->??無(wú)響應(yīng)?,??非正常響應(yīng)
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???已到介質(zhì)末端,介質(zhì)存儲(chǔ)已滿
EM?用于,當(dāng)數(shù)據(jù)存儲(chǔ)到達(dá)串行存儲(chǔ)介質(zhì)末尾的時(shí)候,就像磁帶或磁頭滾動(dòng)到介質(zhì)末尾一樣。其用于表述數(shù)據(jù)的邏輯終點(diǎn),即不必非要是物理上的達(dá)到數(shù)據(jù)載體的末尾。
?
26 – SUB –?SUB?stitute character?替補(bǔ)?/?替換
27 – ESC –?ESC?ape??逃離?/?取消
字符?Escape?,是?ASCII?標(biāo)準(zhǔn)的首創(chuàng)的,由?Bob Bemer?提議的。用于開(kāi)始一段控制碼的擴(kuò)展字符。如此,即可以不必將所有可能想得到的字符都放到?ASCII?標(biāo)準(zhǔn)中了。因?yàn)?#xff0c;新的技術(shù)可能需要新的控制命令,而?ESC?可以用作這些字符命令的起始標(biāo)志。?ESC?廣泛用于打印機(jī)和終端,去控制設(shè)備設(shè)置,比如字體,字符位置和顏色等等。如果最開(kāi)始的?ASCII?標(biāo)準(zhǔn)中,沒(méi)有定義?ESC?,估計(jì)?ASCII?標(biāo)準(zhǔn)早就被其他標(biāo)準(zhǔn)所替代了,因?yàn)槠錄](méi)有包含這些新出現(xiàn)的字符,所以肯定會(huì)有其他新的標(biāo)準(zhǔn)出現(xiàn),用于表示這些字符的。即,?ESC?給開(kāi)發(fā)者提供了,可以根據(jù)需要而定義新含義的字符的可能。
?
28 – FS –?F?ile?S?eparator??文件分隔符
文件分隔符是個(gè)很有意思的控制字符,因?yàn)槠淇梢宰屛覀兛吹?/span>?1960s?年代的時(shí)候,計(jì)算機(jī)技術(shù)是如何組織的。我們現(xiàn)在,習(xí)慣于隨即訪問(wèn)一些存儲(chǔ)介質(zhì),比如?RAM?,磁盤(pán),但是在定義?ASCII?標(biāo) 準(zhǔn)的那個(gè)年代,大部分?jǐn)?shù)據(jù)還是順序的,串行的,而不是隨機(jī)訪問(wèn)的。此處所說(shuō)的串行的,不僅僅指的是串行通信,還指的是順序存儲(chǔ)介質(zhì),比如穿孔卡片,紙帶, 磁帶等。在串行通信的時(shí)代,設(shè)計(jì)這么一個(gè)用于表示文件分隔符的控制字符,用于分割兩個(gè)單獨(dú)的文件,是一件很明智的事情。而?FS?的原因就在于此。
?
29 – GS –?G?roup?S?eparator?分組符
ASCII?定義控制字符的原因中,其中一條就是考慮到了數(shù)據(jù)存儲(chǔ)方面的情況。大部分情況下,數(shù)據(jù)庫(kù)的建立,都和表有關(guān),包含了對(duì)應(yīng)的記錄。同一個(gè)表中的所有的記錄,屬于同一類(lèi)型。不同的表中的記錄,屬于對(duì)應(yīng)的不同的類(lèi)型。而分組符?GS?就是用來(lái)分隔串行數(shù)據(jù)存儲(chǔ)系統(tǒng)中的不同的組。值得注意的是,當(dāng)時(shí)還沒(méi)有使用?word?的表格,當(dāng)時(shí)?ASCII?時(shí)代的人,把他叫做組。
?
30 – RS –?R?ecord?S?eparator?記錄分隔符
記錄分隔符?RS?用于分隔在一個(gè)組或表內(nèi)的多個(gè)記錄。
?
31 – US –?U?nit?S?eparator??單元分隔符
在?ASCII?定義中,在數(shù)據(jù)庫(kù)中所存儲(chǔ)的,最小的數(shù)據(jù)項(xiàng),叫做?Unit?單元。而現(xiàn)在我們稱(chēng)其?field?域。單元分隔符?US?用于分割串行數(shù)據(jù)存儲(chǔ)環(huán)境下的不同的域。
現(xiàn)在大部分的數(shù)據(jù)庫(kù)實(shí)現(xiàn),要求大部分類(lèi)型都擁有固定的長(zhǎng)度。
盡管大部分時(shí)候可能用不到,但是對(duì)于每一個(gè)域,卻都要分配足夠大的空間,用于存放最大可能的成員變量。這樣的做法,占用了大量的存儲(chǔ)空間,而?US?控制碼允許域具有可變的長(zhǎng)度。在?1960s?年代,數(shù)據(jù)存儲(chǔ)空間很有限,用?US?這個(gè)單元分隔符,將不同單元分隔開(kāi),這樣就可以實(shí)現(xiàn)更高效地存儲(chǔ)那些寶貴的數(shù)據(jù)。另一方面,串行存儲(chǔ)的存儲(chǔ)效率,遠(yuǎn)低于RAM?和磁盤(pán)中所實(shí)現(xiàn)的表格存儲(chǔ)。我個(gè)人無(wú)法想象,如果現(xiàn)在的數(shù)據(jù),還是存儲(chǔ)在自帶或者帶滾輪的磁帶上,會(huì)是何種景象。
?
32 – SP – White?SP?ace??空格鍵
也許你會(huì)爭(zhēng)論說(shuō),空格鍵是否真的能算是一個(gè)控制字符?因?yàn)楝F(xiàn)在在普通文字中使用空格鍵是如此常見(jiàn)。
但是,既然水平制表符和退格鍵在?ASCII?中, 都被叫做控制字符了,那么我覺(jué)得也很自然地,可以把空格鍵(向前的空格)也叫做控制字符,畢竟,其本身并不代表一個(gè)真正的可見(jiàn)的字符,而僅僅只是很常用于 輸出設(shè)備,用于處理位置前向移動(dòng)一格,清除當(dāng)前位置的內(nèi)容而已。在很多程序中,比如字符處理程序,白空格同樣可能從導(dǎo)致行尾轉(zhuǎn)到下一行行首,而網(wǎng)絡(luò)瀏覽器 將多個(gè)空格組合成單個(gè)空格輸出。
所以,這更加堅(jiān)定了我的想法,覺(jué)得完全可以把空格看成是一個(gè)控制字符,而不僅僅是一個(gè)很獨(dú)特的普通字符。
?
127 – DEL –?DEL?ete???刪除
有人也許會(huì)問(wèn),為何?ASCII?字符集中的控制字符的值都是很小的,即?0-32?,而?DEL?控制字符的值卻很大,是?127?。這是由于這個(gè)特殊的字符是為紙帶而定義的。而在那個(gè)時(shí)候,絕大多數(shù)的紙帶,都是用?7?個(gè)孔洞去編碼數(shù)據(jù)的。而?127?這個(gè)值所對(duì)應(yīng)的二進(jìn)制值為?111 1111b?,表示所有?7?個(gè)比特位都是高,所以,將?DEL?用在現(xiàn)存的紙帶上時(shí),所有的洞就都被穿孔了,就把已經(jīng)存在的數(shù)據(jù)都擦出掉了,就起到了對(duì)應(yīng)的刪除的作用了。
?
【引用】
1?.??ASCII character map
http://www.lammertbies.nl/comm/info/ascii-characters.html
?
2?.???百度百科:?ASCII
http://baike.baidu.com/view/15482.htm
?
3.??ASCII?編碼表
http://www.dreamdu.com/xhtml/ascii/
總結(jié)
以上是生活随笔為你收集整理的ASCII码不可见字符过滤处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 何处是我家
- 下一篇: 基于SSM流浪宠物管理系统