Roselia-Blog

ANSI Color Escape

09/13/2020 16:24:24

见习魔法师

ANSI Escape Sequence

在使用非Windows平台上的terminal的时候,我们有时会惊叹于其丰富的文本内容,其文本可以改变颜色, 增加下划线,加粗等等效果,宛如在写一个web page。

又例如,在2.7版本的Lisa以后,控制台的字符也支持着色了,如图:

控制台的显示设置由选择图形再现(Select Graphic Rendition, SGR)参数决定1

SGR参数属于ANSI转义序列的一种,以"\u001b["开头,即Esc+[, 具体是Esc [ 参数 m,其中参数是若干个数字,以分号;分割。[m分别代表相应字符,大小写敏感。

例如,我要传入两个SGR参数,分别是10331,查,分别代表亮黄色背景和红色前景,则其相应的转义序列为:\u001b[103;31m,即如果stdout在输出相应的字符之后,接下来的字符都按照亮黄色背景,红色的方式输出。

计算机对参数的读取可以理解为状态机,在某些参数之后可以接着更多的参数,即,terminal在进入某种状态之后可以接受更多的参数,转移到新的状态。

目前,terminal接受一些预定义的颜色,例如红色,品红之类的,这些颜色在不同平台上具有不同的颜色,取决于具体的实现。但是,在2020年下半年的现在,大家都习惯于24bit的「绚丽色彩」了,自然现在许多非Windows平台上的终端模拟器都支持TrueColor了。

想要设置自定义颜色,其参数应当是这样的:

请在下方输入你的颜色,我们以你输入的颜色为例,你输入的颜色为,这个是16进制颜色,需要先转换为RGB颜色。 其值为:R = , G = , B = 。

所以,如果你想要打印的文字,就要传入这些SGR参数:, 相应的转义序列为: \u001b[ m

同理,如果你要打印的文字,就要传入这些SGR参数:, 相应的转义序列为: \u001b[ m

如果我们想要清空当前SGR参数,只需要传一个0即可,我们通常会在改变完文字的格式以后,立即传入以防止污染接下来的格式。

下面是Playground,以供更加真切地体会ANSI 转义序列。

你输入的颜色:

输入的文字:

其整体的序列为:\u001b\u001b[0m

你可以这么在命令行中测试:

echo "\u001b\u001b[0m"

在命令行中的效果: