终端机如何显示颜色?

138 阅读3分钟

注:我将使用控制台和终端的同义词,尽管两者之间存在着差异。

终端不再符合这样的描述--"黑底白字的沉闷屏幕"。
也许你已经注意到一些终端命令返回了彩色的文本。

How Terminals display color?

上面的图片是htop程序展示系统指标的方式。它看起来优雅而美丽,不是吗?

历史

视频终端制造商增加了供应商特定的转义序列来完成一些操作,如造型、光标定位。然而,这产生了一个不一致的问题。

作为解决不一致问题的方法,开发了诸如termcap和utitlities ietput等库,以创建一个统一的API,控制台程序可以用它来将颜色纳入其功能。

除此之外,美国国家标准学会制定了控制代码字符集,即ANSI X3.64。当时最早支持ANSI转义代码的视频终端之一是VT100。目前,ANSI X3.64可能看起来很模糊,因为它与ECMA-48合并成了ISO 6429,之后,ANSI撤回了它的标准,转而采用国际标准--ISO 6429。

终端如何显示颜色

如果一个转义字符(\033)被0x40-0x5F范围内的一个字节减去,那么转义序列的解释就被委托给C1控制代码

C1控制代码集定义了一个控制序列引入器(CSI),用于启动大多数的序列,即ESC [或Ox9B。

有各种控制序列(一系列改变计算机状态的字符,而不是作为常规字节打印)与CSI序列不同,但我们将关注选择图形渲染(SGR)CSI序列,因为它负责字符的样式和颜色。SGR的格式为。ESC [ n m
其中n代表一系列的参数,m是结束符。

SGR定义了用于设置各种显示属性的参数,通过用分号(;)分隔参数,可以在同一序列中设置多个属性。

How Terminals display color?
How Terminals display color?

你可以在SGR中设置的参数的摘录。你可以从这个维基百科页面找到完整的表格。

试试吧

#!/bin/bash

BOLD_RED='\033[1;31;47m'
NO_COLOR='\033[0m'
echo -e "I ${BOLD_RED}love${NO_COLOR} Linux"

当你运行该bash脚本时,你会看到一个白色背景的红色加粗的爱字
How Terminals display color?

注意:运行bash脚本已经超出了本文的范围。

BOLD_RED的SGR设置被NO_COLOR重置的SGR退去了,这意味着下面的文字之后将以终端的当前设置显示。

试试下面的变化

  • \033[31;47;4;9m
  • \X303[32;47;4;3m
  • \033[41;4;3m

3比特与8比特与24比特的颜色

最初,终端只支持8种颜色(3位色)。黑(30)、红(31)、绿(32)、黄(33)、蓝(34)、品(35)、青(36)、白(37)。很少有终端实现了1个SGR参数,那些实现了的终端使用了后8种颜色的亮色版本,因此总共有16种颜色。

目前,大多数终端仿真器都支持256色组和24位颜色。
设置8位颜色

  • \38;5;n m (用256色设置来设置前景色)
  • \48;5;n m (用256色组设置背景色

How Terminals display color?
其中n是与256色查询表中的颜色相对应的数字。

设置24位颜色

  • \38;2;r;g;b m (设置前景24位颜色
  • \48;2;r;g;b m (设置背景24位颜色)

其中r、g、b分别是红、绿、蓝的量。

试试吧

#!/bin/bash

DARK_GREEN='\033[38;5;100m'
NO_COLOR='\033[0m'
echo -e "I ${DARK_GREEN}love${NO_COLOR} Linux"

当你运行上述bash脚本时,你会得到以下结果。
How Terminals display color?

用下面的变化试一下

  • \033[38;5;100;4m
  • \033[38;5;200;9m
  • \033[38;5;220;3m

谢谢你阅读OpenGenus的这篇文章。