在终端中打印多样化文字

在终端中打印多样化文字

先给出几种环境下的解决方案:

在Python中:

1
print("\033[31;43;1mError!\033[0m")

在shell中:

1
2
3
4
echo "\e[31;43;1mError\!\e[0m"
#
echo -e "\e[31;43;1mError\!\e[0m"
# -e 参数用于启用 echo 命令控制符转码

在C++中:

1
std:cout << "\033[31;43;1m" << "Error!" << "\033[0m" << std:endl;

可以看出在多种环境下,解决这个问题的方案基本上没有区别,因为终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033)。

下面以字符串'\e[31;43;1mError!\e[0m'为例说明:

开头的\e[31;43;1m符号释义:

  • \e: 代表开始ANSI Escape code

    1. ANSI Escape code
      终端用于文本字符的输入和输出,ASCII编码中有些字符是不能用来打印显示的,比如’\a’ 0x7代表响铃,’\n’ 0x0A 代表换行,这些字符被称为控制符。
      在此之中,控制符 ‘\e’ 0x1B,这个字符代表 ESC ,即键盘上 ESC 按键的作用。ESC 是单词 escape 的缩写,即逃逸的意思。文本中出现这个转义字符,代表其后方的字符是ANSI Escape code编码。
      ANSI Escape code编码中有专门控制字符颜色的控制符,例如:\e[37;44;4;1m
    2. 因为 \e 控制符的16进制码为 0x1B , 8 进制码为 033 ,所以以下表示方式等价:
      \e[37;44;4;1mMCC\e[0m
      \x1b[37;44;4;1mMCC\x1b[0m
      \x1B[37;44;4;1mMCC\x1B[0m
      \033[37;44;4;1mMCC\033[0m
  • [: 代表转义序列开始符 CSI,Control Sequence Introducer

  • 37;44;4;1: 代表以; 分隔的文本样式控制符,其中 37 代表文本前景色为白色,44代表背景为蓝色,4代表下划线,1代表加粗。

    由于在 前景色、背景色、显示样式 之中没有重复的值,不会造成混淆,因此放置顺序可以自由调整。而且显示样式也可以使用多个。

  • m: 代表结束控制符序列

结尾的\e[0m字符释义

  • \e: 代表开始ANSI Escape code
  • [: 代表转义序列开始符 CSI,Control Sequence Introducer
  • 0: 代表重置文本样式——说明样式自定义到此结束,后边使用默认样式,不再适用前面的定义
  • m: 代表结束控制符序列

总结一下,解决方案分为三部分:"前缀 文本 后缀"(中间不必有空格)

测试:

终端彩色输出

下面简要概括(搬运)一下可选的样式参数

显示方式 效果 前景色 背景色 颜色描述
0 终端默认设置 30 40 黑色
1 高亮显示(加粗) 31 41 红色
4 使用下划线 32 42 绿色
5 闪烁 33 43 黄色
7 反白显示 34 44 蓝色
8 不可见 35 45 紫红色
22 非高亮显示 36 46 青蓝色
24 去下划线 37 47 白色
25 去闪烁
27 非反白显示
28 可见

参考文章中有对可选参数十分详细的介绍,[3]中尤为详细。

参考
[1]. python中print打印显示颜色
[2]. Linux终端呈现彩色输出
[3]. 在终端中输出彩色文字