控制字符

控制字符,是出現在特定的信息文本中,表示某一控制功能的字符

計算中,一個控制字符非打印字符,是一個碼位(一個數字)是否在字符集,其自身也是書寫字母來描述的。所有輸出在32以下的ASCII表都是這個類型,包括

  • BEL(要求有聲信號來響應終端的接收)
  • SYN(同步信號)
  • ENQ(要求接收後發出響應來驗證存在)
  • Unicode標準增加了許多新的非打印字符,比如零寬不連字

在ASCII中

在ASCII中常用的控制字符包括

  • 7(bell響鈴),用來使收到該字符的設備發出某種警告
  • 8(backspace退格),用來刪除或者疊打上一個被打印的字符
  • 9(horizontal tab水平制表)
  • 10(line feed饋行),在大多數UNIX系統和變異系統中用來結束行
  • 12(form feed饋頁),用來使打印機饋出一頁
  • 13(carriage return歸位),在Mac OSOS-9英語OS-9FLEXCP/M-80派生的系統中,包括DOS,用於結束文本行
  • 27(escape轉義)

人們有時會遇到其他代碼的現代用法,如用編碼4(傳輸結束)結束Unix shell會話或PostScript打印機的傳輸。

編碼27(轉義)值得詳細描述。儘管很多控制字符是從不使用的,將設備控制信息和可打印字符混合傳送的概念卻非常有用,這使設備製造商得以建立一種可用來傳送上百條設備指令的途徑。具體來說是使用稱為控制序列轉義序列的一種由多個字符構成的序列。

典型的方式是首先發送編碼27提醒設備將後續字符解釋為控制序列而非普通的打印文本,之後跟隨一個或多個字符指出某個具體的操作,這之後設備會返回到正常解釋字符的狀態(即不再將後續字符解釋為控制序列)。例如由編碼27後跟隨可打印的字符「[2;10H」組成的序列會使一個DEC Digital VT-102終端將光標移動到屏幕第2行的第10個位置。這些序列存在着一些標準,廣知的是基於VT-100系列終端的行為的ANSI X3.64(1979),但在應用中存在大量非標準的變化,特別是在技術進步的速度大大超過任何標準所能追趕的速度的打印機工業領域中。

在鍵盤上如何映射控制字符

基於ASCII的鍵盤上有個標為「Control」或「Ctrl」(有時也作「Cntl」)的鍵,其用法非常類似於換檔鍵,即與其他字母或符號鍵一起按下。通過這種方式使用控制鍵將生成同時按下的字符鍵的ASCII編碼字節的7位中,左起的兩個字元強制定為0;從而產生出32個ASCII控制碼之一。例如,按下CTRL和字母G(十進制編碼為71,二進制為01000111),產生編碼7(振鈴符,十進制編碼7,或二進制00000111)。

鍵盤上有些單個鍵能產生控制碼。例如標為「Backspace」的鍵通常產生編碼8,「Tab」是編碼9,「Enter」或「Return」是編碼13(有些鍵盤上「Enter」可能是編碼10)。

現在的鍵盤上有些鍵沒有對應的ASCII字符或控制字符,例如光標控制鍵/箭頭鍵和字處理功能鍵。這些鍵盤和其所連接的計算機通過三種方法通信:將一些在其他情況下不使用的控制字符定義新的用法、使用其他一些非ASCII的編碼、或者使用由多個字符構成的控制序列。連接到獨立的個人電腦上的鍵盤通常用前兩種方法之一或兩者都用,啞終端通常是使用控制序列。

設計目的

控制字符被設計分為若干組:打印和顯示控制、數據結構化、傳輸控制、以及其他零散用途。

打印和顯示控制

打印控制字符最先用於控制作為最早的輸出設備的打印機的物理機件。回車(CR)意為將字符放置於紙邊開始打印處(可能要移動到下一行,也可能不是)。換行(LF)表示將下個字符放置於新行出現的方向上的下一行處(也可能同時要移動到行起始處,也可能不是)。垂直和水平制表(VT/HT)則請求打印機將打印頭移動到閱讀方向上的下個制表位置。換頁(FF)則開始一張新紙。退格(BS)將下個打印位置後退一個字符以便打印機可進行疊打而產生特殊字符(例如在文字下加下劃線,在早期的字符打印機上是先打出文字後再用退格符將打印頭退後,再疊打出下劃線的)。移入(SI)和移出(SO)用於選擇替換的字符集、字體、下劃線或其他打印模式,然而更常見的是使用其他的轉義序列來實現這些目的。

隨着不使用紙張打印、並在字符放置、刪除等方面提供了更多靈活性的終端機的出現,打印控制碼也進一步適應了這些變化。例如饋頁表示清除屏幕而非饋送下一張白紙。人們設計了更複雜的轉義序列來應用新終端和新打印機功能的優點。單個字符的控制碼已經不夠用來支持新外圍設備的所有功能了,控制字符和轉義序列之間的差別也開始變得模糊。

數據結構化

分隔符(組、記錄等)用於將數據結構化,通常用於磁帶,為的是模擬穿孔卡片。介質結束(EM)意為警告磁帶(或其他介質)即將到達末尾。

傳輸控制

傳輸控制字符是設計用來將數據包結構化以及控制在傳輸發生錯誤時何時進行重傳的。

報頭開始(SOH)用於標記數據包中的非數據部分——即含有地址和其他內務數據報文的部分。正文開始(SOT)標記報頭的結束和正文的開始。正文結束(EOT)標記報文數據的結束。標準的常規是在正文結束符之前的兩個字符處填入報文的校驗和或CRC

轉義符(ESC)用於在報文中放在一個正常情況下會被解釋為控制字符的二進制值前,以避免該字符被作為控制字符解釋。例如二進制值27的正確用法是ESC ESC。

替換符(SUB)用於請求將下個可打印字符轉換為一個二進制值,通常是將第5位置零。由於一些傳輸介質(例如由打字機產生的紙張)僅能傳輸可打印的字符,因此用於這類情況時這樣做很方便。

取消符(CAN)中止一個包的傳輸。否認符(NAK)請求重新傳輸一個包。確認符(ACK)表示傳輸內容被正確地接收。

當傳輸介質使用半雙工(指某一時刻只能進行一個方向的傳輸)時,通常有一可在任意時間傳輸數據的主站和一個或多個可在獲得准許後進行傳輸的從站。主站使用查詢符(ENQ)來要求從站發送其下條報文。從站通過發出傳輸結束符(EOT)來表示其已完成了傳輸。

設備控制碼原本是不特定的,是對每種設備定義不同的。然而在數據傳輸中一種普遍的需要是當接收方不能接收更多數據時需要請求發送方立即暫停傳輸。數據設備公司發明了一套協議,其用19(DC3,也即CTRL-S或XOFF)來停止傳輸,並用17(DC1,也即CTRL-Q或XON)來開始傳輸。籍此製造商們能不必在數據纜線中用專門的傳輸控制線來控制傳輸,這節約了成本且由於減少了纜線中連接的數量也增加了作業的可靠程度。

數據鏈路轉義(DLE)告訴數據鏈路的另一端結束一個會話,以便對方釋放線路資源。

零散用途

許多ASCII控制字符是為當時使用而現在很少見到的設備而設計的。例如編碼22,同步空閒(SYN),原本用於同步調製解調器(其必須連續發送數據)在沒有數據要傳送時發送。(現在的系統一般使用起始位來告知要傳送的字的開始。)

編碼0,空字符,是個特例。它在紙帶中就是那些沒有穿孔的地方,因此把它作為不存在的字符來對待是很方便的。

編碼127同樣是個特例。在二進制編碼中它的所有位都是1,這使得它可方便地用來清除作為當時普遍使用的存儲介質的紙帶中的一段,把要清除的部分全部穿孔就成了DEL字符。紙帶很快被廢棄了,因此這個特色也幾乎不用了。

然而由於其編碼處於其他可打印的字符占用的區域中,許多計算機把它作為一個額外的可打印字符來使用(通常是一個實心的黑色方塊字符,可用疊打來蓋除文字)。

七位ASCII定義了33個代碼作為控制字符,它們是0到31、以及127,(位於0x00-0x1F及0x7F)。

US-ASCII控制字符
Seq 十進 十六進 縮寫 字符名
00 0x00 NUL Null(空)
^A 01 0x01 SOH Start of Heading(報頭開始)
^B 02 0x02 STX Start of Text(正文開始)
^C 03 0x03 ETX End of Text(正文結束)
^D 04 0x04 EOT End of Transmission(傳輸結束)
^E 05 0x05 ENQ Enquiry(查詢)
^F 06 0x06 ACK Acknowledge(確認)
^G 07 0x07 BEL Bell(振鈴)
^H 08 0x08 BS Backspace(退格)
^I 09 0x09 HT Horizontal Tab(水平制表)
^J 10 0x0A LF Line Feed(饋行)
^K 11 0x0B VT Vertical Tab(垂直制表)
^L 12 0x0C FF Form Feed(饋頁)
^M 13 0x0D CR Carriage Return(回車)
^N 14 0x0E SO Shift Out(移出)
^O 15 0x0F SI Shift In(移入)
^P 16 0x10 DLE Data Link Escape(數據鏈路轉義)
^Q 17 0x11 DC1 Device Control 1(設備控制1)
^R 18 0x12 DC2 Device Control 2(設備控制2)
^S 19 0x13 DC3 Device Control 3(設備控制3)
^T 20 0x14 DC4 Device Control 4(設備控制4)
^U 21 0x15 NAK Negative Acknowledge(否認)
^V 22 0x16 SYN Synchronous Idle(同步空閒)
^W 23 0x17 ETB End of Transmission Block(傳輸塊結束)
^X 24 0x18 CAN Cancel(取消)
^Y 25 0x19 EM End of Medium(介質結束)
^Z 26 0x1A SUB Substitute(替換)
^[ 27 0x1B ESC Escape(轉義)
^\ 28 0x1C FS File Separator(文件分隔符)
^] 29 0x1D GS Group Separator(分組符)
^^ 30 0x1E RS Record Separator(記錄分隔符)
^_ 31 0x1F US Unit Separator(單元分隔符)
^? 127 0x7F DEL Delete(刪除)

兼容的八ISO/IEC 8859-1加上了從ISO/IEC 6429定義的從128到159的32個代碼,位於0x80-0x9F。

ISO-8859-n的控制字符
十進 十六進 縮寫 字符名
128 0x80 PAD Padding Character(填充字符)
129 0x81 HOP High Octet Preset(高字節前置)
130 0x82 BPH Break Permitted Here(此處允許中斷)
131 0x83 NBH No Break Here(此處禁止中斷)
132 0x84 IND Index(索引)
133 0x85 NEL Next Line(下一行)
134 0x86 SSA Start of Selected Area(選擇區域開始)
135 0x87 ESA End of Selected Area(選擇區域結束)
136 0x88 HTS Horizontal Tab Set(水平制表設置)
137 0x89 HTJ Horizontal Tab Justified(水平制表調整)
138 0x8A VTS Vertical Tab Set(垂直制表設置)
139 0x8B PLD Partial Line Forward(部分行前移)
140 0x8C PLU Partial Line Backward(部分行後移)
141 0x8D RI Reverse Line Feed(逆向饋行)
142 0x8E SS2 Single-Shift 2(單個移動2)
143 0x8F SS3 Single-Shift 3(單個移動3)
144 0x90 DCS Device Control String(設備控制串)
145 0x91 PU1 Private Use 1(私用1)
146 0x92 PU2 Private Use 2(私用2)
147 0x93 STS Set Transmit State(發送規則設置)
148 0x94 CCH Cancel Character(取消字符)
149 0x95 MW Message Waiting(消息等待)
150 0x96 SPA Start of Protected Area(保護區域開始)
151 0x97 EPA End of Protected Area(保護區域結束)
152 0x98 SOS Start of String(串開始)
153 0x99 SGCI Single Graphic Char Intro(單個圖形字符描述)
154 0x9A SCI Single Char Intro(單個字符描述)
155 0x9B CSI Control Sequence Intro(控制順序描述)
156 0x9C ST String Terminator(串終止)
157 0x9D OSC OS Command(操作系統指令)
158 0x9E PM Private Message(私訊)
159 0x9F APC App Program Command(應用程序命令)

參看

外部連結