控制字符(有时候也称非打印字符),是出现在特定的信息文本中,表示某一控制功能的字符.这类字符并不显示,只包含某种特定的功能.
BEL
响铃字符十进制编码为 7,而 7 的二进制为01000111
,如果将二进制前 2 为替换为00
,那么这就是响铃符BEL
的二进制00000111
.如果你使用过xterm.js,那么你应该见过这类控制字符.
使用
目前来说大部分的键盘都是基于 ASCII,因此你会看到你的键盘上会有一个按键Ctrl
,这个健可以跟其它的字母或符号组成组合键,同时生成 32 个 ASCII 控制码之一.比如按下Ctrl + G
,那么产生的是BEL
响铃字符,编码为 7,根据上面那个规则,二进制为00000111
.
设计这类控制字符的目的是为了打印和 terminal 中显示控制,数据结构化,传输控制以及其它的用途.
打印
用于最早的打印设备,提供回车(CR),换行(LF),换页(FF),退格(BS)等处理.
terminal
对于我们经常接触到的 terminal(终端)来说,我们在上面使用各种 shell 来执行各种命令(比如 ubuntu 上的tyy1->tyy6
),常用的 shell 有 linux 下的bash
,sh
,zsh
,fish
以及 windows 下的cmd.exe
,PowerShell
,当然还有其它的,不过都没有上面这些出名而已.
简单的来说 terminal 通过键盘,鼠标等输入设备接受各种用户的输入,然后传递给 shell,然后 shell 进行解析并丢给操作系统内核去执行.在这其中 terminal 会处理以下集中类似情况:
- 用户输入的字符直接扔给 shell 执行.
- 用户输入的特定组合键进行拦截,不会进行转发.比如
Ctrl + C
会导致发送一个SIGNIT
(Unix 信号)让进程终止(当前有进程正在运行的情况下).可是输入stty -a
命令查看当前终端的设置. - 将用户键盘输入的控制字符转化为对应控制序列(
Esc
->^[
),shell 再解析并执行此控制序列(^[
->Esc
).
其它的比如用户选择 shell 的输出进行复制等功能都是 terminal 提供,与 shell 没有关系.而行编辑以及历史命令补全,历史记录搜索都是 shell 提供.
传输控制
这里涉及到一些计算机网络的知识.传输控制字符是设计用来将数据包结构化以及控制在传输发生错误时何时进行重传的.
比如ESC
转义符用于在报文中放在一个正常情况下会被解释为控制字符的二进制值前,以避免该字符被作为控制字符解释.CAN
取消符中止一个包的传输.NAK
否认符请求重新传输一个包.ACK
确认符表示传输内容被正确地接收.
其它用途
许多 ASCII 控制字符是为当时使用而现在很少见到的设备而设计的.例如编码 22,同步空闲(SYN),原本用于同步调制解调器(其必须连续发送数据)在没有数据要传送时发送.(现在一般用于计算机网络中数据的起始位,发送到接收端来告知要传送的数据的开始序号.)
下面这些是相关的 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(删除) |