ANSI转义序列介绍

ANSI转义序列(ANSI escape sequences),或称ANSI逃逸字符,是一种用于控制终端行为的特殊转义序列.他们可以用于控制终端上的光标位置,颜色等选项,因此也称为ANSI终端控制码.在要打印的字符序列中加入这些控制码,终端会将其解释为对应的指令,而不是普通的字符编码.

最初不同的终端都各自加入了自己的控制序列,例如VT52终端等.

但是由于这些终端的实现各不相同,不得不开发了一些复杂的库(例如termcap)和实用程序(例如tput),来让我们使用同一套API来操作不同的终端.另外,很多终端需要使用字符的二进制值来发送数字,这对于某些编程语言,以及内部不使用ASCII的系统来说,将数字转换为正确的字符非常困难,甚至无法做到.

ANSI标准试图解决这些问题,指定了一套所有终端共享的指令集,并要求用ASCII的数字字符传递所有数值信息.ANSI标准也经过了多次修订,支持该标准的经典终端是VT100,其非常成功.

控制字符

序列中的控制字符会立即生效,然后才会继续处理下一个字符.

十进制 十六进制 字符 解释
0 00 NUL (NULL) 空字符
1 01 SOH (Start Of Headling) 标题开始
2 02 STX (Start Of Text) 正文开始
3 03 ETX (End Of Text) 正文结束
4 04 EOT (End Of Transmission) 传输结束
5 05 ENQ (Enquiry) 请求
6 06 ACK (Acknowledge) 回应/响应/收到通知
7 07 BEL (Bell) 响铃
8 08 BS (Backspace) 退格(行首不起作用)
9 09 HT (Horizontal Tab) 水平制表符(如果后面已无位置则跳至行尾)
10 0A LF/NL(Line Feed/New Line) 换行键
11 0B VT (Vertical Tab) 垂直制表符
12 0C FF/NP (Form Feed/New Page) 换页键
13 0D CR (Carriage Return) 回车键
14 0E SO (Shift Out) 不用切换
15 0F SI (Shift In) 启用切换
16 10 DLE (Data Link Escape) 数据链路转义
17 11 DC1/XON (Device Control 1/Transmission On) 设备控制1/传输开始
18 12 DC2 (Device Control 2) 设备控制2
19 13 DC3/XOFF (Device Control 3/Transmission Off) 设备控制3/传输中断
20 14 DC4 (Device Control 4) 设备控制4
21 15 NAK (Negative Acknowledge) 无响应/非正常响应/拒绝接收
22 16 SYN (Synchronous Idle) 同步空闲
23 17 ETB (End of Transmission Block) 传输块结束/块传输终止
24 18 CAN (Cancel) 取消
25 19 EM (End of Medium) 已到介质末端/介质存储已满/介质中断
26 1A SUB (Substitute) 替补/替换
27 1B ESC (Escape) 逃离/取消(开始一个新的转义序列)
28 1C FS (File Separator) 文件分割符
29 1D GS (Group Separator) 组分隔符/分组符
30 1E RS (Record Separator) 记录分离符

ANSI转义序列(非CSI)

下面是一些常见的非CSI转义序列,其他序列可前往文末参阅链接1查看.

ESC c RIS 重绘屏幕.
ESC D IND 换行.
ESC E NEL 新的一行.
ESC H HTS 设置制表位.
ESC M RI 翻转换行(Reverse linefeed),即向上换行还是向下换行.
ESC [ CSI 控制序列导入器
ESC % G 选择 UTF-8
ESC # 8 DECALN DEC 屏幕校准测试 - 以E填充屏幕.
ESC ] OSC (是Operating system command的缩写)Execute screen command.

CSI序列

CSI序列ESC[ 以及若干个 参数字节 和 若干个 中间字节 以及 一个 最终字节 组成.

其中ESC可以使用\x1b或者\033,即十六进制或八进制值.

各字节的范围如下:

组成部分 字符范围 ASCII
参数字节 0x30–0x3F 0–9:;<=>?
中间字节 0x20–0x2F 空格!"#$%&’()*+,-./
最终字节 0x40–0x7E @A–Z[]^_a–z{|}~

常见序列格式:

代码 名称 作用
CSI n A CUU – 光标上移(Cursor Up) 光标向指定的方向移动n(默认1)格.如果光标已在屏幕边缘,则无效.
CSI n B CUD – 光标下移(Cursor Down)
CSI n C CUF – 光标前移(Cursor Forward)
CSI n D CUB – 光标后移(Cursor Back)
CSI n E CNL – 光标移到下一行(Cursor Next Line) 光标移动到下面第n(默认1)行的开头.
CSI n F CPL – 光标移到上一行(Cursor Previous Line) 光标移动到上面第n(默认1)行的开头.
CSI n G CHA – 光标水平绝对(Cursor Horizontal Absolute) 光标移动到第n(默认1)列.
CSI n; m H CUP – 光标位置(Cursor Position) 光标移动到第n行、第m列.值从1开始,且默认为1(左上角).例如CSI ;5HCSI 1;5H含义相同;CSI 17;HCSI 17HCSI 17;1H三者含义相同.
CSI n J ED – 擦除显示(Erase in Display) 清除屏幕的部分区域.如果n是0(或缺失),则清除从光标位置到屏幕末尾的部分.如果n是1,则清除从光标位置到屏幕开头的部分.如果n是2,则清除整个屏幕(在DOS ANSI.SYS中,光标还会向左上方移动).如果n是3,则清除整个屏幕,并删除回滚缓存区中的所有行(这个特性是xterm添加的,其他终端应用程序也支持).
CSI n K EL – 擦除行(Erase in Line) 清除行内的部分区域.如果n是0(或缺失),清除从光标位置到该行末尾的部分.如果n是1,清除从光标位置到该行开头的部分.如果n是2,清除整行.光标位置不变.
CSI n S SU – 向上滚动(Scroll Up) 整页向上滚动n(默认1)行.新行添加到底部.(非ANSI.SYS)
CSI n T SD – 向下滚动(Scroll Down) 整页向下滚动n(默认1)行.新行添加到顶部.(非ANSI.SYS)
CSI n ; m f HVP – 水平垂直位置(Horizontal Vertical Position) 同CUP.
CSI n m SGR – 选择图形再现(Select Graphic Rendition) 设置SGR参数,包括文字颜色.CSI后可以是0或者更多参数,用分号分隔.如果没有参数,则视为CSI 0 m(重置/常规).
CSI 5i 打开辅助端口 启用辅助串行端口,通常用于本地串行打印机
CSI 4i 关闭辅助端口 禁用辅助串行端口,通常用于本地串行打印机
CSI 6n DSR – 设备状态报告(Device Status Report) ESC[n;mR(就像在键盘上输入)向应用程序报告光标位置(CPR),其中n是行,m是列.
CSI s SCP – 保存光标位置(Save Cursor Position) 保存光标的当前位置.
CSI u RCP – 恢复光标位置(Restore Cursor Position) 恢复保存的光标位置.

选择图形再现(SGR)参数

代码 作用 备注
0 重置/正常 关闭所有属性.
1 设置粗体
2 亮度减半弱化(降低强度) 未广泛支持.
3 斜体 未广泛支持.有时视为反相显示.
4 下划线
5 缓慢闪烁 低于每分钟150次.
6 快速闪烁 MS-DOS ANSI.SYS;每分钟150以上;未广泛支持.
7 反显 前景色与背景色交换.
8 隐藏 未广泛支持.
9 划除 字符清晰,但标记为删除.未广泛支持.
22 正常颜色或强度 不强不弱.
23 非斜体、非尖角体
24 关闭下划线 去掉单双下划线.
25 关闭闪烁
27 关闭反显
28 关闭隐藏
29 关闭划除
30–37 设置前景色 参见下面的颜色表.
38 设置前景色 下一个参数是5;n2;r;g;b,见下.
40–47 设置背景色 参见下面的颜色表.
48 设置背景色 下一个参数是5;n2;r;g;b,见下.
53 上划线
55 关闭上划线
90–97 设置明亮的前景色 aixterm(非标准).
100–107 设置明亮的背景色 aixterm(非标准).

颜色

3/4位

image-20240220100602854

例如可以使用\x1b[1;5;33;104m来设置前景色为黄色,背景色为亮蓝色,粗体并缓慢闪烁.

8位

即256颜色.

1
2
3
4
5
6
ESC[ … 38;5;<n> … m选择前景色(n是下表中的一种)
ESC[ … 48;5;<n> … m选择背景色
0- 7:标准颜色(同ESC [ 30–37 m)
8- 15:高强度颜色(同ESC [ 90–97 m)
16-231:6 × 6 × 6 立方(216色): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
232-255:从黑到白的24阶灰度色
image-20240220100950925

24位

即RGB色彩.

1
2
ESC[ … 38;2;<r>;<g>;<b> … m选择RGB前景色
ESC[ … 48;2;<r>;<g>;<b> … m选择RGB背景色

附录

参考: