控制字符

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

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

## 設計目的

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

### 列印和顯示控制

列印控制字元最先用於控制作為最早的輸出裝置的印表機的物理機件。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）。

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

## 參看

* 符號控制鍵使用
* 跳脫字元
* 轉換鍵

## 外部連結

* ISO/IEC 6429 資訊科技 -- 編碼字元組的控制功能 （頁面存檔備份，存於網際網路檔案館）
* ECMA-48 標準 （頁面存檔備份，存於網際網路檔案館）：編碼字元組的控制功能「1991 年 6 月第五版」
* 編碼字元組的控制功能