过滤ASCII码中的不可见字符, ASCII三部分, 各控制字符详解, 去^@,^M
今天產(chǎn)品部同事報(bào)告了一個(gè)BUG,經(jīng)過(guò)調(diào)試發(fā)現(xiàn),由于用戶(hù)輸入的字符串中,包含字符0x1E, 也就是”記錄分隔符”(Record Separator, Notepad++ 顯示為[RS]),導(dǎo)致JavaScript XML解析遭遇錯(cuò)誤。于是就想在字符串中過(guò)濾掉這些沒(méi)多大用途的字符,同時(shí)又要保留部分常用的字符,例如換行,回車(chē)和水平制表符。于是寫(xiě)了下面一個(gè) PHP 函數(shù):
/**
* 清理字符串中的部分不可見(jiàn)控制字符
*
* @param string $string 待處理字符串
* @return string 處理后的字符串
* @author fising(at)qq.com
*/
public static function clearInvisibleCharacter($string = '')
{
/* 排除 tab,
, 三個(gè)字符 */
$do_not_searches = array(chr(9), chr(10), chr(13));
/* 需清理的字符列表 */
$searches = array();
for ($i = 0; $i <= 31; $i++)
{
if (!in_array(chr($i), $do_not_searches))
{
$searches[] = chr($i);
}
}
$searches[] = chr(127);
return str_replace($searches, '', $string);
}
過(guò)濾ASCII碼中的不可見(jiàn)字符
上面所說(shuō)的“不可見(jiàn)字符”,其實(shí)屬于ascii碼中的控制字符,它們是0到31、以及127,分別代表什么可查詢(xún)ascii碼表。
在展示頁(yè)面前,將文字中的控制字符改為空格(ascii32)
public static String filter(String content){
if (content != null && content.length() > 0) {
char[] contentCharArr = content.toCharArray();
for (int i = 0; i < contentCharArr.length; i++) {
if (contentCharArr[i] < 0x20 || contentCharArr[i] == 0x7F) {
contentCharArr[i] = 0x20;
}
}
return new String(contentCharArr);
}
return "";
}
其具體每個(gè)控制字符的含義,詳解介紹如下:
【ASCII中的Function/Control Code功能字符的詳細(xì)含義】
0 – NUL –NULl字符/空字符
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)為,的時(shí)候,就意味著這個(gè)是一個(gè)字符串的結(jié)尾了。這樣就方便按照自己需求去定義字符串,多長(zhǎng)都行,當(dāng)然只要你內(nèi)存放得下,然后最后加一個(gè),即空字符,意思是當(dāng)前字符串到此結(jié)束。
1 – SOH –Start
OfHeading標(biāo)題開(kāi)始
如果信息溝通交流主要以命令和消息的形式的話(huà),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)頭的話(huà),那么重新同步,就很難實(shí)現(xiàn)了。
2 – STX –StartOfText文本開(kāi)始
3 – ETX –End OfText文本結(jié)束
通過(guò)某種通訊協(xié)議去傳輸?shù)囊粋€(gè)數(shù)據(jù)(包),稱(chēng)為一幀的話(huà),常會(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)椋钤绲臅r(shí)候,一個(gè)消息中,總是包含一個(gè)開(kāi)始符和一個(gè)終止符?,F(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 –EndOfTransmission傳輸結(jié)束
5 – ENQ –ENQuiry請(qǐng)求
6 – ACK –ACKnowledgment回應(yīng)/響應(yīng)
7 – BEL – [audible]BELl
在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 –BackSpace退格鍵
退格鍵的功能,隨著時(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ǔ)言中,退格鍵可以用表示。
9 – HT –HorizontalTab水平制表符
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ǔ)言中,用 表示制表符。
10 – LF –LineFeed換行
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ǔ)言中,用
表示。
11 – VT –VerticalTab垂直制表符
垂直制表符,類(lèi)似于水平制表符Tab,目的是為了減少布局中的工作,同時(shí)也減少了格式化字符時(shí)所需要存儲(chǔ)字符的空間。VT控制碼用于跳到下一個(gè)標(biāo)記行。說(shuō)實(shí)話(huà),還真沒(méi)看到有些地方需要用這個(gè)VT呢,因?yàn)橐话阍趽Q行的時(shí)候,都是用LF代替VT了。
12 – FF –FormFeed
換頁(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è)贓nter的同時(shí),也希望把光標(biāo)移動(dòng)到下一行。因此C語(yǔ)言和Unix操作系統(tǒng),重新定義了LF的意思,使其表示為移動(dòng)到下一行。當(dāng)輸入CR去存儲(chǔ)數(shù)據(jù)的時(shí)候,軟件也常常隱式地將其轉(zhuǎn)換為L(zhǎng)F。
14 – SO –ShiftOut不用切換
15 – SI –ShiftIn
啟用切換
早在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 –DataLinkEscape數(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 –DeviceControl 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)椋薈trl+Q鍵盤(pán)序列實(shí)際上就是產(chǎn)生XON控制碼,其可以將那些由于終端或者主機(jī)方面,由于偶爾出現(xiàn)的錯(cuò)誤的XOFF控制碼而中斷的通信解鎖,使其正常通信。
18 – DC2 –DeviceControl 2
19 – DC3 –DeviceControl 3 / XOFF – Transmission off傳輸中斷
20 – DC4 –DeviceControl 4
21 – NAK –NegativeAcKnowledgment負(fù)面響應(yīng)->無(wú)響應(yīng),非正常響應(yīng)
22 – SYN –SYNchronous idle
23 – ETB –End ofTransmissionBlock塊傳輸中止
24 – CAN –CANcel取消
25 – EM –End ofMedium
已到介質(zhì)末端,介質(zhì)存儲(chǔ)已滿(mǎn)
EM用于,當(dāng)數(shù)據(jù)存儲(chǔ)到達(dá)串行存儲(chǔ)介質(zhì)末尾的時(shí)候,就像磁帶或磁頭滾動(dòng)到介質(zhì)末尾一樣。其用于表述數(shù)據(jù)的邏輯終點(diǎn),即不必非要是物理上的達(dá)到數(shù)據(jù)載體的末尾。
26 – SUB –SUBstitute character替補(bǔ)/替換
27 – ESC –ESCape逃離/取消
字符Escape,是ASCII標(biāo)準(zhǔn)的首創(chuàng)的,由Bob Bemer提議的。用于開(kāi)始一段控制碼的擴(kuò)展字符。如此,即可以不必將所有可能想得到的字符都放到ASCII標(biāo)準(zhǔn)中了。因?yàn)椋碌募夹g(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 –FileSeparator文件分隔符
文件分隔符是個(gè)很有意思的控制字符,因?yàn)槠淇梢宰屛覀兛吹?960s年代的時(shí)候,計(jì)算機(jī)技術(shù)是如何組織的。我們現(xiàn)在,習(xí)慣于隨即訪(fǎng)問(wèn)一些存儲(chǔ)介質(zhì),比如RAM,磁盤(pán),但是在定義ASCII標(biāo)準(zhǔn)的那個(gè)年代,大部分?jǐn)?shù)據(jù)還是順序的,串行的,而不是隨機(jī)訪(fǎng)問(wèn)的。此處所說(shuō)的串行的,不僅僅指的是串行通信,還指的是順序存儲(chǔ)介質(zhì),比如穿孔卡片,紙帶,磁帶等。在串行通信的時(shí)代,設(shè)計(jì)這么一個(gè)用于表示文件分隔符的控制字符,用于分割兩個(gè)單獨(dú)的文件,是一件很明智的事情。而FS的原因就在于此。
29 – GS –GroupSeparator分組符
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 –RecordSeparator記錄分隔符
記錄分隔符RS用于分隔在一個(gè)組或表內(nèi)的多個(gè)記錄。
31 – US –UnitSeparator單元分隔符
在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 – WhiteSPace空格鍵
也許你會(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 –DELete
刪除
有人也許會(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)的刪除的作用了。
【各種字符的標(biāo)準(zhǔn)的讀法/叫法】
常見(jiàn)ASCII字符,以及其他非常見(jiàn)的字符,Unicode中的字符,其他特殊字符等等,這些字符的英文叫法,可以去Unicode官方找到:
http://www.unicode.org/charts/
比如:
ASCII字符/字母的叫法/讀法
如何讀
:
1. C0 Control and Basic Latin Range:0000-007F
http://www.unicode.org/charts/PDF/U0000.pdf
2.Alphabetic Presentation Forms Range:FB00-FB4F
http://www.unicode.org/charts/PDF/UFB00.pdf
3.CJK Compatibility Forms
http://www.unicode.org/charts/PDF/UFE30.pdf
4.Fullwidth ASCII Punctuation
http://www.unicode.org/charts/PDF/UFF00.pdf
【引用】
1.C0 and C1 control codes
http://en.wikipedia.org/wiki/C0_and_C1_control_codes
2. Control Character
http://en.wikipedia.org/wiki/Control_character
3.
ASCII character map
http://www.lammertbies.nl/comm/info/ascii-characters.html
4.
百度百科:ASCII
http://baike.baidu.com/view/15482.htm
5.ASCII編碼表
http://www.dreamdu.com/xhtml/ascii/
ASCII碼大致可以分作三部分組成。
第一部分:ASCII非打印控制字符表
ASCII表上的數(shù)字0–31分配給了控制字符,用于控制像打印機(jī)等一些外圍設(shè)備。例如,12代表?yè)Q頁(yè)/新頁(yè)功能。此命令指示打印機(jī)跳到下一頁(yè)的開(kāi)頭。(參詳ASCII碼表中0-31)
第二部分:ASCII打印字符
數(shù)字 32–126 分配給了能在鍵盤(pán)上找到的字符,當(dāng)您查看或打印文檔時(shí)就會(huì)出現(xiàn)。數(shù)字127代表 DELETE 命令。(參詳ASCII碼表中32-127)
ASCII碼表 0-127
第三部分:擴(kuò)展ASCII打印字符
擴(kuò)展的ASCII字符滿(mǎn)足了對(duì)更多字符的需求。擴(kuò)展的ASCII包含ASCII中已有的128個(gè)字符(數(shù)字0–32顯示在下圖中),又增加了128個(gè)字符,總共是256個(gè)。即使有了這些更多的字符,許多語(yǔ)言還是包含無(wú)法壓縮到256個(gè)字符中的符號(hào)。因此,出現(xiàn)了一些ASCII的變體來(lái)囊括地區(qū)性字符和符號(hào)。例如,許多軟件程序把ASCII表(又稱(chēng)作ISO8859-1)用于北美、西歐、澳大利亞和非洲的語(yǔ)言。
Vim里常見(jiàn)的幾個(gè)不可見(jiàn)字符:
^@ = 0x00 Null值
^H = 0x08 退格
^I = 0x09 水平制表
^J = 0x0A 換行
^M = 0x0D 回車(chē)
去掉^M回車(chē):
:%s/^M//g # vi中將^M替換成回車(chē)。
$ sed -e 's/^M//g' myfile.txt #直接操作文件
注意:這里的“^M”要使用“CTRL-V CTRL-M”生成,而不是直接鍵入“^M”。
去掉^@:
sed -r 's/x0//g' file>file1
cat -v file打印不可見(jiàn)字符。
【什么是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 |
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 |
Backspace(退格) |
^H |
|
|
9 |
09 |
HT |
|
Horizontal Tab(水平制表符) |
^I |
|
10 |
0A |
LF |
|
Line feed(換行鍵) |
^J |
|
11 |
0B |
VT |
v |
Vertical Tab(垂直制表符) |
^K |
|
12 |
0C |
FF |
f |
Form feed(換頁(yè)鍵) |
^L |
|
13 |
0D |
CR |
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ǔ)已滿(mǎn)) |
^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(刪除) |
?* |
注(*):
1.轉(zhuǎn)義字符:即在C語(yǔ)言中或其他地方如何表示。
2.用鍵盤(pán)輸入控制字符:其中,32是空格鍵,都不需要加Ctrl鍵,即可直接輸入。
3.127是Delete鍵,除了可以用鍵盤(pán)上的刪除鍵輸入,也可以用Ctrl+?輸入。
4.可以通過(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等等。
^
總結(jié)
以上是生活随笔為你收集整理的过滤ASCII码中的不可见字符, ASCII三部分, 各控制字符详解, 去^@,^M的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 海军军医大学生长军官学员学号按什么排的
- 下一篇: 别克英朗爬坡到底用d加还是d减?