前端时间,写了一篇 PHP 在 Console 模式下的进度显示 ,正好最近的一个数据合并项目需要用到控制台颜色输出,所以就把相关的信息整理下,写到OSC的博客中。
请注意,此篇文章中的颜色仅适用于仿真器(putty、secureCRT、XShell),以及unix终端,不适用于CMD
(但依然可用于WIN下的仿真器)
简介

在终端或仿真器中输入下面的代码,并回车,预览最直接的效果。
echo -e "\033[1;31mI ♡ You \e[0m"
请注意,引号内的\e
等同于\033
;\033
、\x1b
和\e
效果是一样,对应键盘左上角Esc键对应的ASCII码
(8进制);
通用的控制文本颜色的转义序列格式如下:
CSI n1 [;n2 [;…]] m
其中CSI全称为“控制序列引导器”(Control Sequence Introducer/Initiator),也就是上述示例中的"\033["(其中\033是你键盘左上角Esc键对应的ascii码(八进制));
n1、n2等表示SGR参数(下面会列出一些常用的SGR参数),用于控制颜色、粗体、斜体、闪烁等文本输出格式;m表示转义序列结束。
颜色参数
常用颜色
格式:\033[显示方式;前景色;背景色m 说明: 前景色 背景色 颜色 --------------------------------------- 30 40 黑色 31 41 红色 32 42 绿色 33 43 黃色 34 44 蓝色 35 45 紫红色 36 46 青蓝色 37 47 白色 显示方式 意义 ------------------------- 0 终端默认设置 1 高亮显示 4 使用下划线 5 闪烁 7 反白显示 8 不可见 例子: \033[1;31;40m <!--1-高亮显示 31-前景色红色 40-背景色黑色--> \033[0m <!--采用终端默认设置,即取消颜色设置-->

RGB颜色

使用方式:
ESC[ … 38;2;<r>;<g>;<b> … m Select RGB foreground color ESC[ … 48;2;<r>;<g>;<b> … m Select RGB background color
特别注意:此处用法需从38
开始设置, 代表前景色,48
代表后景色;2
代表RGB
模式,后面三位为RGB数值。前后仍可使用SRG参数
例子:
echo -e "\033[1;38;2;255;85;85mI ♡ You \e[0m"
附:经测试,在不是用SRG
参数的情况下,可将;
替换为:
但在使用SRG
参数时无效。 即:echo -e "\033[38:2:255:85:85mI ♡ You \e[0m"
256色模式

使用方式:
ESC[ … 38;5;<n> … m Select foreground color ESC[ … 48;5;<n> … m Select background color
例子:
echo -e "\033[1;38;5;9mI ♡ You \e[0m"
SRG控制参数
| 0 | 关闭所有格式,还原为初始状态 | | 1 | 粗体/高亮显示 | | 2 | 模糊(※) | | 3 | 斜体(※) | | 4 | 下划线(单线) | | 5 | 闪烁(慢) | | 6 | 闪烁(快)(※) | | 7 | 交换背景色与前景色 | | 8 | 隐藏(伸手不见五指,啥也看不见)(※) |
(1)其中含有(※)标注的编码表示不是所有的终端仿真器都支持,只有少数仿真器支持。
(2)多个SGR参数可以组合使用,例如:echo -e "\x1b[31;4mRed Underline Text\e[0m"输出红色下划线字体“Red Underline Text”。
(3)更多参数信息请参考“ANSI escape code”。
各语言下的控制台颜色输出
PHP
// hello.php <?php echo "\033[1;38;5;9mI ♡ You \e[0m\n";
请注意此处使用的是"
而不是单引号,因为颜色代码需要转义,正如echo
的-e
一样。
C
// hello.c #include <stdio.h> int main() { printf("\033[1;31mI ♡ You \e[0m\n"); }
编译:gcc hello.c
运行:./a.out
C++
// hello.cpp #include <iostream> int main() { std::cout << "\033[1;31mI ♡ You \e[0m" << std::endl; }
编译:g++ hello.cpp
运行:./a.out
Java
// hello.java class hello { public static void main(String[] args) { System.out.println("\033[1;31mI ♡ You \033[0m"); } }
注:Java中不能识别\e和\0x1b,仅可使用\033。
编译:javac hello.java
运行:java hello
Python
# hello.py print "\033[1;31mI ♡ You \x1b[0m"
注:python(v2.6.5)中不能识别\e,可以使用\033和\x1b。
运行:python hello.py
相关链接
PHP Color Class
wikipedia ANSI_escape_code
LINUX彩色的终端命令行 - 使用 ANSI 色彩代码
Linux终端和win32控制台文本颜色输出
教你写一个color日志库,不止有代码还有原理