控制字符

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

在计算中，一个控制字符或非打印字符，是一个码位（一个数字）是否在字符集，其自身也是书写字母来描述的。所有输出在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月第五版”
- 编码字符组的控制功能