Obeta

ASCII控制字符

我们经常使用terminal,其中有时候会发现会输入一些奇怪的字符,这类字符就是ASCII字符,它们只有简单的控制功能.

控制字符(有时候也称非打印字符),是出现在特定的信息文本中,表示某一控制功能的字符.这类字符并不显示,只包含某种特定的功能.

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十进十六进缩写字符名
000x00NULNull(空)
^A010x01SOHStart of Heading(报头开始)
^B020x02STXStart of Text(正文开始)
^C030x03ETXEnd of Text(正文结束)
^D040x04EOTEnd of Transmission(传输结束)
^E050x05ENQEnquiry(查询)
^F060x06ACKAcknowledge(确认)
^G070x07BELBell(振铃)
^H080x08BSBackspace(退格)
^I090x09HTHorizontal Tab(水平制表)
^J100x0ALFLine Feed(馈行)
^K110x0BVTVertical Tab(垂直制表)
^L120x0CFFForm Feed(馈页)
^M130x0DCRCarriage Return(回车)
^N140x0ESOShift Out(移出)
^O150x0FSIShift In(移入)
^P160x10DLEData Link Escape(数据链路转义)
^Q170x11DC1Device Control 1(设备控制 1)
^R180x12DC2Device Control 2(设备控制 2)
^S190x13DC3Device Control 3(设备控制 3)
^T200x14DC4Device Control 4(设备控制 4)
^U210x15NAKNegative Acknowledge(否认)
^V220x16SYNSynchronous Idle(同步空闲)
^W230x17ETBEnd of Transmission Block(传输块结束)
^X240x18CANCancel(取消)
^Y250x19EMEnd of Medium(介质结束)
^Z260x1ASUBSubstitute(替换)
^[270x1BESCEscape(转义)
^\ 280x1CFSFile Separator(文件分隔符)
^]290x1DGSGroup Separator(分组符)
^^300x1ERSRecord Separator(记录分隔符)
^_310x1FUSUnit Separator(单元分隔符)
1270x7FDELDelete(删除)

引用

个人随笔记录,内容不保证完全正确,若需要转载,请注明作者和出处.