前端時間,寫了一篇 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