ANSI 颜色转义序列列表

Posted

技术标签:

【中文标题】ANSI 颜色转义序列列表【英文标题】:List of ANSI color escape sequences 【发布时间】:2011-06-18 01:32:50 【问题描述】:

在大多数终端上,可以使用\033 ANSI 转义序列对输出进行着色。

我正在寻找所有支持的颜色和选项(如明亮和闪烁)的列表。

由于支持它们的终端之间可能存在差异,我主要对 xterm 兼容终端支持的序列感兴趣。

【问题讨论】:

其实你可以在windows cmd中使用颜色。 ***.com/questions/41207496/… 来自MSDN 【参考方案1】:

您正在寻找的 ANSI 转义序列是 Select Graphic Rendition 子集。所有这些都有形式

\033[XXXm

其中XXX 是一系列以分号分隔的参数。

也就是说,用 C 语言将文本变为红色、粗体和下划线(我们将在下面讨论许多其他选项),您可以编写:

printf("\033[31;1;4mHello\033[0m");

在 C++ 中你会使用

std::cout<<"\033[31;1;4mHello\033[0m";

在 Python3 中你会使用

print("\033[31;1;4mHello\033[0m")

你会在 Bash 中使用

echo -e "\033[31;1;4mHello\033[0m"

其中第一部分使文本变为红色 (31)、粗体 (1)、下划线 (4),最后一部分清除所有这些 (0)。

如下表所述,您可以设置大量的文本属性,例如粗体、字体、下划线等。

字体效果

Code Effect Note
0 Reset / Normal all attributes off
1 Bold or increased intensity
2 Faint (decreased intensity) Not widely supported.
3 Italic Not widely supported. Sometimes treated as inverse.
4 Underline
5 Slow Blink less than 150 per minute
6 Rapid Blink MS-DOS ANSI.SYS; 150+ per minute; not widely supported
7 [[reverse video]] swap foreground and background colors
8 Conceal Not widely supported.
9 Crossed-out Characters legible, but marked for deletion. Not widely supported.
10 Primary(default) font
11–19 Alternate font Select alternate font n-10
20 Fraktur hardly ever supported
21 Bold off or Double Underline Bold off not widely supported; double underline hardly ever supported.
22 Normal color or intensity Neither bold nor faint
23 Not italic, not Fraktur
24 Underline off Not singly or doubly underlined
25 Blink off
27 Inverse off
28 Reveal conceal off
29 Not crossed out
30–37 Set foreground color See color table below
38 Set foreground color Next arguments are 5;&lt;n&gt; or 2;&lt;r&gt;;&lt;g&gt;;&lt;b&gt;, see below
39 Default foreground color implementation defined (according to standard)
40–47 Set background color See color table below
48 Set background color Next arguments are 5;&lt;n&gt; or 2;&lt;r&gt;;&lt;g&gt;;&lt;b&gt;, see below
49 Default background color implementation defined (according to standard)
51 Framed
52 Encircled
53 Overlined
54 Not framed or encircled
55 Not overlined
60 ideogram underline hardly ever supported
61 ideogram double underline hardly ever supported
62 ideogram overline hardly ever supported
63 ideogram double overline hardly ever supported
64 ideogram stress marking hardly ever supported
65 ideogram attributes off reset the effects of all of 60-64
90–97 Set bright foreground color aixterm (not in standard)
100–107 Set bright background color aixterm (not in standard)

2 位颜色

你已经得到了这个!

4 位颜色

实施终端颜色的标准始于有限的(4 位)选项。下表列出了各种终端仿真器用于这些的背景色和前景色的 RGB 值:

使用上述方法,您可以在绿色背景上制作红色文本(但为什么?)使用:

\033[31;42m

11 种颜色(插曲)

在他们的“基本颜色术语:它们的普遍性和演变”一书中,布伦特柏林和保罗凯使用从一系列语言家族的 20 种不同语言收集的数据来确定 11 种可能的基本颜色类别:白色、黑色、红色、绿色、黄色、蓝色、棕色、紫色、粉色、橙色和灰色。

Berlin 和 Kay 发现,在少于最多 11 个颜色类别的语言中,颜色遵循特定的进化模式。这种模式如下:

    所有语言都包含黑色(冷色)和白色(亮色)的术语。 如果一种语言包含三个术语,则它包含一个红色术语。 如果一种语言包含四个术语,则它包含一个表示绿色或黄色(但不是两者)的术语。 如果一种语言包含五个术语,则它同时包含绿色和黄色术语。 如果一种语言包含六个术语,那么它包含一个蓝色术语。 如果一种语言包含七个术语,那么它包含一个棕色术语。 如果一种语言包含八个或更多术语,则它包含紫色、粉红色、橙色或灰色的术语。

这可能就是故事Beowulf只包含黑色、白色和红色的原因。这也可能是圣经不包含蓝色的原因。荷马的奥德赛包含几乎 200 倍的黑色和大约 100 倍的白色。红色出现 15 次,而黄色和绿色仅出现 10 次。 (More information here)

语言之间的差异也很有趣:请注意英语和汉语使用的大量不同颜色的词。然而,深入研究这些语言表明,每种语言都以不同的方式使用颜色。 (More information)

一般而言,人类语言中颜色​​的命名、使用和分组令人着迷。现在,回到节目。

8 位 (256) 颜色

技术进步,256 种预选颜色的表格可用,如下所示。

使用上面的这些,你可以像这样制作粉红色的文字:

\033[38;5;206m     #That is, \033[38;5;<FG COLOR>m

并使用

制作清晨的蓝色背景
\033[48;5;57m      #That is, \033[48;5;<BG COLOR>m

当然,您可以将这些组合起来:

\033[38;5;206;48;5;57m

8 位颜色排列如下:

0x00-0x07:  standard colors (same as the 4-bit colours)
0x08-0x0F:  high intensity colors
0x10-0xE7:  6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
0xE8-0xFF:  grayscale from black to white in 24 steps

所有颜色

现在我们生活在未来,完整的 RGB 光谱可通过以下方式获得:

\033[38;2;<r>;<g>;<b>m     #Select RGB foreground color
\033[48;2;<r>;<g>;<b>m     #Select RGB background color

因此,您可以使用

将粉红色文本放在褐色背景上
\033[38;2;255;82;197;48;2;155;106;0mHello

支持“真彩色”终端已列出here。

以上大部分内容来自***页面“ANSI escape code”。

一个方便的提醒自己的脚本

由于我经常试图记住颜色是什么,所以我有一个方便的脚本,名为:~/bin/ansi_colours:

#!/usr/bin/python

print "\\033[XXm"

for i in range(30,37+1):
    print "\033[%dm%d\t\t\033[%dm%d" % (i,i,i+60,i+60);

print "\033[39m\\033[49m - Reset colour"
print "\\033[2K - Clear Line"
print "\\033[<L>;<C>H OR \\033[<L>;<C>f puts the cursor at line L and column C."
print "\\033[<N>A Move the cursor up N lines"
print "\\033[<N>B Move the cursor down N lines"
print "\\033[<N>C Move the cursor forward N columns"
print "\\033[<N>D Move the cursor backward N columns"
print "\\033[2J Clear the screen, move to (0,0)"
print "\\033[K Erase to end of line"
print "\\033[s Save cursor position"
print "\\033[u Restore cursor position"
print " "
print "\\033[4m  Underline on"
print "\\033[24m Underline off"
print "\\033[1m  Bold on"
print "\\033[21m Bold off"

打印出来

【讨论】:

@giusti:echo -e "\033[38;05;34;1mHi"echo -e "\033[38;05;34m\033[1mHi" 都为我工作,虽然抗锯齿字体效果确实导致颜色的外观在我正在测试的终端中的粗体下略有变化。 以 38 和 48 开头的 SGR (\033[) 代码 应该 与另外保留的 : 分隔作为子分隔符,尽管这并不完全清楚来自主要来源:ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf 和 itu.int/rec/…。还有一些解释忘记了2 (16M-color RGB)/3 (16M-color CMY) /4 (??? CMYK) 形式中的颜色空间 ID - 例如对于白色 16M 前景应该是 \033[38:2::255:255:255m 而不是 \033[38:2:255:255:255m 我继续讨论这个问题的原因是,我编写的一个项目Mudlet 必须同时处理这两种形式,而我最近竭尽全力让它更好地工作...... 离题(以及 4 年后),但你的插曲让我想起了一段时间前对 VMS 中的“错误”的回复 (pfoley.public.iastate.edu/Decleapyear.htm)。我希望你喜欢阅读。 我只是想找到一份 ANSI 颜色列表,并花了太多时间阅读有关“基本颜色术语”的文章。感谢您的极大分心! :)【参考方案2】:

怎么样:

ECMA-48 - Control Functions for Coded Character Sets, 5th edition (June 1991) - 一个定义颜色控制代码的标准,显然也被 xterm 支持。

SGR 38 和 48 最初由 ECMA-48 保留,但几年后在 ITU、IEC 和 ISO 联合标准中得到充实,该标准分为几个部分,其中(还有很多其他内容)记录 direct colourindexed colour 的 SGR 38/48 控制序列:

Information technology — Open Document Architecture (ODA) and interchange format: Document structures。 T.412。国际电信联盟。 Information technology — Open Document Architecture (ODA) and interchange format: Character content architectures。 T.416。国际电信联盟。 Information technology— Open Document Architecture (ODA) and Interchange Format: Character content architectures。 ISO/IEC 8613-6:1994。国际标准化组织。

xterm in this table on the Wikipedia page for ANSI escape codes有一栏

【讨论】:

【参考方案3】:

还有一些更有趣的以及相关信息。

http://wiki.bash-hackers.org/scripting/terminalcodes http://www.termsys.demon.co.uk/vtansi.htm(已死;archive.org snapshot) http://invisible-island.net/xterm/ctlseqs/ctlseqs.html http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/c327.html https://wiki.archlinux.org/index.php/Color_Bash_Prompt

【讨论】:

嗯,我进行了编辑以修复死链接,但我忘记了我当时没有登录并且我稍微弄乱了格式(我试图离开旧链接但有它被划掉了)-不幸的是,即使我现在已登录,我也无法进行修改以对其进行修改... 8-P 感谢编辑,我已修复。可悲的是,链接死了,像这样的基于链接的答案肯定会腐烂。不会再创建这样的答案 - 但保留这个答案,因为它仍然大部分按预期工作。 :-)【参考方案4】:

它与您的终端绝对相关。 VTE不支持眨眼,如果你使用gnome-terminaltildaguaketerminatorxfce4-terminal等根据VTE,你不会眨眼。 如果您在 VTE 上使用或想要使用 blink,则必须使用 xterm。 您可以使用带有终端名称的 infocmp 命令:

#infocmp vt100
#infocmp xterm
#infocmp vte

例如:

# infocmp vte
#   Reconstructed via infocmp from file: /usr/share/terminfo/v/vte
vte|VTE aka GNOME Terminal,
    am, bce, mir, msgr, xenl,
    colors#8, cols#80, it#8, lines#24, ncv#16, pairs#64,
    acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz||~~,
    bel=^G, bold=\E[1m, civis=\E[?25l, clear=\E[H\E[2J,
    cnorm=\E[?25h, cr=^M, csr=\E[%i%p1%d;%p2%dr,
    cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J,
    cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
    cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
    dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J,
    el=\E[K, enacs=\E)0, home=\E[H, hpa=\E[%i%p1%dG, ht=^I,
    hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=^J, invis=\E[8m,
    is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8,
    kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~,
    kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C,
    kb2=\E[E, kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB,
    kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kf1=\EOP,
    kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P,
    kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~,
    kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~,
    kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~,
    kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R,
    kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~,
    kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~,
    kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~,
    kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS,
    kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~,
    kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
    kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~,
    kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R,
    kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
    kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
    kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
    kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
    kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~, khome=\EOH,
    kich1=\E[2~, kind=\E[1;2B, kmous=\E[M, knp=\E[6~,
    kpp=\E[5~, kri=\E[1;2A, kslt=\E[4~, meml=\El, memu=\Em,
    op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, ritm=\E[23m,
    rmacs=^O, rmam=\E[?7l, rmcup=\E[2J\E[?47l\E8, rmir=\E[4l,
    rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, rs1=\Ec,
    rs2=\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h,
    sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
    sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;,
    sgr0=\E[0m\017, sitm=\E[3m, smacs=^N, smam=\E[?7h,
    smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
    smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
    u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,

【讨论】:

VTE 0.52 / gnome-terminal 3.28 增加了对闪烁文本的支持(因此它也可以在其他基于 VTE 的模拟器中使用)。【参考方案5】:

对于那些除了提到的语言之外没有得到正确结果的人,如果您使用 C# 将文本打印到控制台(终端)窗口,您应该将 "\033" 替换为 “\x1b”。在 Visual Basic 中,它将是 Chrw(27)

【讨论】:

以上是关于ANSI 颜色转义序列列表的主要内容,如果未能解决你的问题,请参考以下文章

text BASH:为ANSI文本颜色转义序列设置变量

使用 PHP 将 ANSI 转义序列转换为 HTML

将 ANSI 转义(终端格式/颜色代码)转换为 HTML 的库 [关闭]

读取设备状态报告 ANSI 转义序列回复

读取线被ANSI转义序列混淆

如何让 win32 控制台识别 ANSI/VT100 转义序列?