控制字符

控制字符，是出現在特定的資訊文本中，表示某一控制功能的字符。

在計算中，一個控制字符或非列印字符，是一個碼位（一個數字）是否在字符集，其自身也是書寫字母來描述的。所有輸出在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 OS、OS-9、FLEX和CP/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）。

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。

十進｜十六進｜縮寫｜字符名

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（應用程式命令）

## 外部連結

- ISO/IEC 6429資訊技術 --編碼字符組的控制功能
- ECMA-48標準：編碼字符組的控制功能「1991年6月第五版」
- 編碼字符組的控制功能