ANSI转义序列

本文最后更新于:2023年12月5日 晚上

参考:https://zh.m.wikipedia.org/zh-hans/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97

ANSI 转义序列(ANSI escape sequences)是一种带内信号(英语:In-band signaling)的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以ESC转义字符和”[“字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码

ANSI 序列是在二十世纪七十年代引入的标准,用以取代特定于终端供应商的序列,并在二十世纪八十年代早期开始在计算机设备市场上广泛使用。与早期缺少光标移动功能的系统相比,新生的电子公告板系统使用 ANSI 序列改进其显示。正是因为这个原因,ANSI 序列变成了所有制造商共同采用的标准。

在 21 世纪,尽管硬件文本终端已经越来越少了,但 ANSI 标准依然存在,因为大多数终端模拟器会对部分 ANSI 转义序列进行解释。一个值得注意的例外是,在微软Windows 10更新 TH2 之前,Windows 操作系统Win32 控制台是不支持 ANSI 转义序列的。

转义序列

序列具有不同的长度。所有序列都以 ASCII 字符**[ESC](https://zh.m.wikipedia.org/wiki/退出键)**(27 / 十六进制 0x1B)开头,第二个字节则是 0x40–0x5F(ASCII @A–Z[\]^_)范围内的字符。[12]:5.3.a

一些 ANSI 转义序列(不完整列表)

序列 **C1 名称 作用
ESC [ 0x9b CSI - 控制序列导入器(Control Sequence Introducer) 大部分有用的序列,请参阅下一节。结束于 ASCII 64 到 126 (@~/十六进制 0x40 到 0x7E).[12]

CSI

CSI 序列由ESC [、若干个(包括 0 个)“参数字节”、若干个“中间字节”,以及一个“最终字节”组成。

所有常见的序列都只是把参数用作一系列分号分隔的数字,如1;2;3。缺少的数字视为 0(如1;;3相当于中间的数字是 0,ESC[m这样没有参数的情况相当于参数为 0)。某些序列(如 CUU)把 0 视为 1,以使缺少参数的情况下有意义。

一些 ANSI 控制序列(不完整列表)

代码 名称 作用
CSI n m SGR – 选择图形再现(Select Graphic Rendition) 设置SGR 参数,包括文字颜色。CSI 后可以是 0 或者更多参数,用分号分隔。如果没有参数,则视为CSI 0 m(重置/常规)。

选择图形再现(SGR)参数

代码 作用 备注
0 重置/正常 关闭所有属性。
1 粗体或增加强度
4 下划线
5 缓慢闪烁 低于每分钟 150 次。
22 正常颜色或强度 不强不弱。
30–37 设置前景色 参见下面的颜色表。
38 设置前景色 下一个参数是5;n2;r;g;b,见下。
39 默认前景色 由具体实现定义(按照标准)。
40–47 设置背景色 参见下面的颜色表。
48 设置背景色 下一个参数是5;n2;r;g;b,见下。
49 默认背景色 由具体实现定义(按照标准)。

颜色

初始的规格只有 8 种颜色,只给了它们的名字。SGR 参数 30-37 选择前景色,40-47 选择背景色。相当多的终端将“粗体”(SGR 代码 1)实现为更明亮的颜色而不是不同的字体,从而提供了 8 种额外的前景色,但通常情况下并不能用于背景色,虽然有时候反显(SGR 代码 7)可以允许这样。例如:在白色背景上显示黑色文字使用ESC[30;47m,显示红色文字用ESC[31m,显示明亮的红色文字用ESC[1;31m。重置为默认颜色用ESC[39;49m(某些终端不支持),重置所有属性用ESC[0m。后来的终端新增了功能,可以直接用 90-97 和 100-107 指定“明亮”的颜色。

字颜色:30———–37

30    黑
31    红
32    绿
33    黄
34    蓝色
35    紫色
36    深绿
37    白色

字背景颜色范围:40—-47

40    黑
41    深红
42    绿
43    黄色
44    蓝色
45    紫色
46    深绿
47    白色

字体加亮颜色:90————97

90    黑
91    红
92    绿
93    黄
94    蓝色
95    紫色
96    深绿
97    白色

背景加亮颜色范围:100——————–107

100   黑
101   深红
102   绿
103   黄色
104   蓝色
105   紫色
106   深绿
107   白色

ANSI 控制码的说明

\033[0m                 # 关闭所有属性
\033[1m                 # 设置高亮度
\033[4m                 # 下划线
\033[5m                 # 闪烁
\033[7m                 # 反显
\033[8m                 # 消隐
\033[30m -- \033[37m    # 设置前景色
\033[40m -- \033[47m    # 设置背景色
\033[nA                 # 光标上移n行
\033[nB                 # 光标下移n行
\033[nC                 # 光标右移n行
\033[nD                 # 光标左移n行
\033[y;xH               # 设置光标位置
\033[2J                 # 清屏
\033[K                  # 清除从光标到行尾的内容
\033[s                  # 保存光标位置
\033[u                  # 恢复光标位置
\033[?25l               # 隐藏光标
\033[?25h               # 显示光标

在 vim 中应用

输入逃逸符^[ : ctrl + v + [

vim 中输入 ^[[1;31m123^[[0m

使用 cat 打印就是红色的 123


ANSI转义序列
http://blog.lujinkai.cn/运维/基础/文本处理/ANSI转义序列/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议