控制字元

控制字元,是出現在特定的資訊文字中,表示某一控制功能的字元

計算中,一個控制字元非列印字元,是一個碼位(一個數字)是否在字元集,其自身也是書寫字母來描述的。所有輸出在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的編碼、或者使用由多個字元構成的控制序列。連接到獨立的個人電腦上的鍵盤通常用前兩種方法之一或兩者都用,啞終端通常是使用控制序列。

設計目的

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

列印和顯示控制

列印控制字元最先用於控制作為最早的輸出裝置的印表機的物理機件。Enter(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(Enter)
^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(應用程式命令)

參看

外部連結