ANSI终端控制码
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 ;5H 和CSI 1;5H 含义相同;CSI 17;H 、CSI 17H 和CSI 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;n 或2;r;g;b ,见下. |
40–47 | 设置背景色 | 参见下面的颜色表. |
48 | 设置背景色 | 下一个参数是5;n 或2;r;g;b ,见下. |
53 | 上划线 | |
55 | 关闭上划线 | |
90–97 | 设置明亮的前景色 | aixterm(非标准). |
100–107 | 设置明亮的背景色 | aixterm(非标准). |
颜色
3/4位
例如可以使用\x1b[1;5;33;104m
来设置前景色为黄色,背景色为亮蓝色,粗体并缓慢闪烁.
8位
即256颜色.
1 | ESC[ … 38;5;<n> … m选择前景色(n是下表中的一种) |
24位
即RGB色彩.
1 | ESC[ … 38;2;<r>;<g>;<b> … m选择RGB前景色 |
附录
参考:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WAHAHA's blog!
评论