Skip to main content

Command Palette

Search for a command to run...

ANSI的esc转义序列

Updated
5 min read
ANSI的esc转义序列

本文较完整第介绍了ANSI的转义序列,大多数都可以用于在普通终端上显示出较为漂亮的界面,本文可以作为一个资料备查。

CSI序列

  • CSI(Control Sequence Introducer)序列由 ESC [ 开始,后面跟若干个参数字节(可以没有),规定范围为 0x30-0x3F(ASCII 0–9:;<=>?);再跟若干个中间字节,规定范围为 0x20-0x2F(ASCII 空格以及!"#$%&'()*+,-./);然后再跟一个结束字符(单个字符),规定范围为 0x40-0x7E(ASCII @A–Z[\]^_`a–z{|}~)
组成部分字符范围ASCII
参数字节0x30–0x3F0–9:;<=>?
中间字节0x20–0x2F空格、!"#$%&'()*+,-./
最终字节0x40–0x7E@A–Z\[\]^_`a–z{}~
  • 常见的序列通常是把一些数字用分号分隔开,例如 1;2;3,缺少的数字视为 0(比如:1;;3被视为1;0;3),ESC[m 这样没有参数的情况相当于参数为 0;

  • 某些序列(如下表中的CUU - 光标上移一行)把0视为1,以使在缺少参数的情况下有意义;

  • 下表摘自维基百科中 CSI序列部分

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

编号代码名称作用
1CSI n ACUU – 光标上移(Cursor Up)光标向指定的方向移动n(默认1)格。如果光标已在屏幕边缘,则无效
2CSI n BCUD – 光标下移(Cursor Down)同上
3CSI n CCUF – 光标前移(Cursor Forward)同上
4CSI n DCUB – 光标后移(Cursor Back)同上
5CSI n ECNL – 光标移到下一行(Cursor Next Line)光标移动到下面第n(默认1)行的开头。(非ANSI.SYS)
6CSI n FCPL – 光标移到上一行(Cursor Previous Line)光标移动到上面第n(默认1)行的开头。(非ANSI.SYS)
7CSI n GCHA – 光标水平绝对(Cursor Horizontal Absolute)光标移动到第n(默认1)列。(非ANSI.SYS)
8CSI n ; m HCUP – 光标位置(Cursor Position)光标移动到第n行、第m列。值从1开始,且默认为1(左上角)。例如CSI ;5H和CSI 1;5H含义相同;CSI 17;H、CSI 17H和CSI 17;1H三者含义相同
9CSI n JED – 擦除显示(Erase in Display)清除屏幕的部分区域。如果n是0(或缺失),则清除从光标位置到屏幕末尾的部分。如果n是1,则清除从光标位置到屏幕开头的部分。如果n是2,则清除整个屏幕(在DOS ANSI.SYS中,光标还会向左上方移动)。如果n是3,则清除整个屏幕,并删除回滚缓存区中的所有行(这个特性是xterm添加的,其他终端应用程序也支持)
10CSI n KEL – 擦除行(Erase in Line)清除行内的部分区域。如果n是0(或缺失),清除从光标位置到该行末尾的部分。如果n是1,清除从光标位置到该行开头的部分。如果n是2,清除整行,光标位置不变
11CSI n SSU – 向上滚动(Scroll Up)整页向上滚动n(默认1)行。新行添加到底部。(非ANSI.SYS)
12CSI n TSD – 向下滚动(Scroll Down)整页向下滚动n(默认1)行。新行添加到顶部。(非ANSI.SYS)
13CSI n ; m fHVP – 水平垂直位置(Horizontal Vertical Position)同CUP
14CSI n mSGR – 选择图形渲染(Select Graphic Rendition)设置SGR参数,包括文字颜色。CSI后可以是0或者更多参数,用分号分隔。如果没有参数,则视为CSI 0 m(重置/常规)
15CSI 5i打开辅助端口启用辅助串行端口,通常用于本地串行打印机
16CSI 4i关闭辅助端口禁用辅助串行端口,通常用于本地串行打印机
17CSI 6nDSR – 设备状态报告(Device Status Report)以ESC[n;mR(就像在键盘上输入)向应用程序报告光标位置(CPR),其中n是行,m是列
18CSI sSCP – 保存光标位置(Save Cursor Position)保存光标的当前位置
19CSI uRCP – 恢复光标位置(Restore Cursor Position)恢复保存的光标位置

SGR参数

  • SGR(Select Graphic Rendition)参数是ANSI转义序列中一组用于控制光标和字体的控制代码

  • 以下内容摘自维基百科中SGR参数部分

代码作用备注
0重置/正常关闭所有属性
1粗体或增加强度
2弱化(降低强度)未广泛支持
3斜体未广泛支持;有时视为反相显示
4下划线
5缓慢闪烁低于每分钟150次
6快速闪烁MS-DOS ANSI.SYS;每分钟150以上;未广泛支持
7反显前景色与背景色交换
8隐藏未广泛支持
9划除字符清晰,但标记为删除。未广泛支持
10主要(默认)字体
11–19替代字体选择替代字体n-10
20尖角体几乎无支持
21关闭粗体或双下划线关闭粗体未广泛支持;双下划线几乎无支持
22正常颜色或强度不强不弱
23非斜体、非尖角体
24关闭下划线去掉单双下划线
25关闭闪烁
27关闭反显
28关闭隐藏
29关闭划除
30–37设置前景色 参见下面的颜色表
38设置前景色下一个参数是5;n或2;r;g;b,见下
39默认前景色由具体实现定义(按照标准)
40–47设置背景色参见下面的颜色表
48设置背景色下一个参数是5;n或2;r;g;b,见下
49默认背景色由具体实现定义(按照标准)
51Framed
52Encircled
53上划线
54Not framed or encircled
55关闭上划线
60表意文字下划线或右边线几乎无支持
61表意文字双下划线或双右边线
62表意文字上划线或左边线
63表意文字双上划线或双左边线
64表意文字着重标志
65表意文字属性关闭重置60–64的所有效果
90–97设置明亮的前景色aixterm(非标准)
100–107设置明亮的背景色aixterm(非标准)

颜色编码

  • 以下内容摘自维基百科中颜色部分

  • 3bit 和 4bit 色彩

    • 因为最早的终端的颜色在硬件上只有 3bits,颜色只有 8 种,所以早期的规范中只给这 8 种颜色做了命名;SRG参数的 30-37 用于选择前景色,40-47 用于选择背景色;SGR 编码中 1 表示字体加粗,但那时许多终端并不是把粗体字(SGR码为 1)当成一个字体,而是使用更明亮的色彩来实现所谓"粗体",通常你无法把这种加亮的色彩用作背景色

    • 例如:使用 ESC[30;47m 是白底黑字的效果,使用 ESC[31m 变成红字,使用 ESC[1;31m 会变成加亮的红字;ESC[39;49m 将恢复到默认的前景、背景色(有些终端不支持),使用 ESC[0m 关闭所有属性也可以恢复默认设置

    • 后来随着技术的进步,终端都增加了直接设置高亮前景色和背景色的功能,前景色使用代码 90-97,背景色使用代码 100-107

    • 随着硬件的进步,开始使用 8bits 的 DAC(Digital-to-Analog Converters 数模转换器),许多软件开始使用 24bit 的颜色编码

颜色名称前景色代码背景色代码
3040
3141
绿3242
3343
3444
品红3545
3646
3747
亮黑(灰)90100
亮红91101
亮绿92102
亮黄93103
亮蓝94104
亮品红95105
亮青96106
亮白97107
  • 8bit 色彩

    • 随着 256 色的图形卡越来越普遍,相应的转义序列也跟着做了变更,可以从预定义的 256 种颜色中选择色彩

        ESC[38;5;⟨n⟩m ---- 选择前景色
        ESC[48;5;⟨n⟩m ---- 选择背景色
            0-  7:  标准色彩 (相当于 ESC [ 30–37 m)
            8- 15:  高亮色彩 (相当于 ESC [ 90–97 m)
        16-231:  6 × 6 × 6 RGB (216 种颜色): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
        232-255:  从黑到白工 24 级灰度
      
  • 24bit色彩

    • 随着有着 16-24bit 种颜色的"真彩"图像卡越来越普遍,应用程序开始支持 24bit 的色彩,Xterm 等终端仿真器开始支持使用转义序列设置24位前景和背景颜色

        ESC[ 38;2;⟨r⟩;⟨g⟩;⟨b⟩ m ---- 选择 RGB 前景色
        ESC[ 48;2;⟨r⟩;⟨g⟩;⟨b⟩ m ---- 选择 RGB 背景色
      

OSC 序列

  • 以下内容译自wikipediaOSC (Operating System Command) sequences

  • 在另一篇文章《关于bash下变量PS1的完整理解》会用到这个说明

  • 大多数 OSC(Operating System Command)序列都是由 Xterm 定义的,但许多其他仿真终端也支持 OSC 序列。由于历史原因,Xterm 可以使用 BEL(ASCII 007) 结束命令,也可以使用标准 ST(ESC ) 结束命令。例如,Xterm 允许使用 \033]0;window title\007 设置窗口标题


email: hengch@163.com donation

More from this blog

双向链表及如何使用GLib的GList实现双向链表

双向链表是一种比单向链表更为灵活的数据结构,与单向链表相比可以有更多的应用场景,本文讨论双向链表的基本概念及实现方法,并着重介绍使用GLib的GList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助学习基于GLib编程的读者较快地掌握GList的使用方法,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;本文适合初学者阅读。 1 双向链表及其实现 在文章《单向链表以及如何使用GLib中的GSList实现单向链表》中,介绍了单向链表以及基于 G...

Oct 29, 20245 min read24
双向链表及如何使用GLib的GList实现双向链表

C程序员应该知道的最好的8个c编程框架

C 编程框架是开发人员必不可少的工具,编程框架可以为构建强大且性能优异的应用程序提供结构化的基础,本文将对 8 个最佳 C 编程框架和库做出简要的介绍,如果您正在寻找适合初学者的 C 编程框架或旨在进行 C 编程框架比较,相信本文可以给您一定的帮助。 顶级 C 编程框架 – 概述 本文将介绍以下 8 个 C 语言编程框架: 序号框架名称主要特点易于集成下载链接 1GTK全面的小部件集,跨平台支持中等的下载 2Qt跨平台支持,集成开发环境中等的下载 3CMocka轻量级,模...

Oct 19, 20244 min read36
C程序员应该知道的最好的8个c编程框架

单向链表以及如何使用GLib中的GSList实现单向链表

单向链表是一种基础的数据结构,也是一种简单而灵活的数据结构,本文讨论单向链表的基本概念及实现方法,并着重介绍使用GLib的GSList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助学习基于GLib编程的读者较快地掌握GSList的使用方法,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;本文适合初学者阅读。 1 单向链表及其实现 在文章《使用GLib进行C语言编程的实例》中,简单介绍了 GLib,建议阅读本文前先阅读这篇文章; 单向链表是一...

Aug 19, 20246 min read23
单向链表以及如何使用GLib中的GSList实现单向链表

使用GLib进行C语言编程的实例

本文将讨论使用GLib进行编程的基本步骤,GLib是一个跨平台的,用C语言编写的3个底层库(以前是5个)的集合,GLib提供了多种高级的数据结构,如内存块、双向和单向链表、哈希表等,GLib还实现了线程相关的函数、多线程编程以及相关的工具,例如原始变量访问、互斥锁、异步队列等,GLib主要由GNOME开发;本文是使用GLib编程的入门文章,旨在通过实例帮助希望学习GLib编程的读者较快地入门,本文将给出多个使用GLib库编程范例的源代码,本文程序在 ubuntu 20.04 下编译测试完成,gc...

Aug 9, 20245 min read9
使用GLib进行C语言编程的实例

Linux下使用libiw进行无线信号扫描的实例

打开电脑连接wifi是一件很平常的事情,但这些事情通常都是操作系统下的wifi管理程序替我们完成的,如何在程序中扫描wifi信号其实资料并不多,前面已经有两篇文章介绍了如何使用ioctl()扫描wifi信号,但其实在Linux下有一个简单的库对这些ioctl()的操作进行了封装,这个库就是libiw,使用libiw可以简化编程,本文介绍了如果使用libiw对wifi信号进行扫描的基本方法,本文将给出完整的源代码,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;尽...

Jul 4, 20244 min read21
Linux下使用libiw进行无线信号扫描的实例

whowin - 开源和分享是技术发展的源泉和动力

42 posts

一个从业30多年的退休程序员,主要从事嵌入式软件开发。