絕對(duì)有趣!利用C語(yǔ)言編寫打印彩色字符,還能閃爍!
1. ANSI escape code
最近在研究日志打印組件easylogger,玩轉(zhuǎn)各種彩色日志打印不亦樂(lè)乎,好奇心越來(lái)越重,遂深入研究,發(fā)現(xiàn)了一個(gè)非常神奇的東西:ANSI escape code!
escape sequence code 全稱叫做 escape sequence code,即 Escape 序列屏幕控制碼,其實(shí)就是一些特殊的字符,將這些字符加入到printf打印的內(nèi)容中,即可輕松實(shí)現(xiàn)在終端軟件中以各種顏色、各種背景色顯示內(nèi)容,還可以高亮、加粗、閃爍,非常好玩!
2. 序列碼格式
一串escape code的內(nèi)容如下:
-
特殊字符 \033
:通知終端切換到escape模式; -
起始字符 [
:CSI內(nèi)容的開(kāi)始; -
CSI內(nèi)容字符(見(jiàn)下表); -
CSI結(jié)束字符 m
:CSI內(nèi)容的結(jié)束;
其中,CSI模式全稱Command Sequence Introduction,當(dāng)終端軟件處于CSI模式時(shí),終端軟件讀取之后的ASCII碼作為CSI內(nèi)容,直到讀入CSI結(jié)束字符,代表不同字符的ASCII字符之間用分號(hào)隔開(kāi)。
代表背景顏色的特殊ASCII字符:
字符 | 顏色 |
---|---|
40 | 黑色 |
41 | 紅色 |
42 | 綠色 |
43 | 黃色 |
44 | 藍(lán)色 |
45 | 紫色 |
46 | 深綠 |
47 | 白色 |
代表字體顏色的特殊字符:
字符 | 顏色 |
---|---|
30 | 黑色 |
31 | 紅色 |
32 | 綠色 |
33 | 黃色 |
34 | 藍(lán)色 |
35 | 紫色 |
36 | 深綠 |
37 | 白色 |
其它一些屏幕控制ASCII字符:
字符 | 動(dòng)作 |
---|---|
0 | 關(guān)閉所有屬性 |
1 | 設(shè)置高亮度 |
4 | 下劃線 |
5 | 閃爍 |
7 | 反顯 |
8 | 消隱 |
最后還有一些控制終端光標(biāo)的字符:
字符 | 動(dòng)作 |
---|---|
nA | 光標(biāo)上移n行 |
nB | 光標(biāo)下移n行 |
nC | 光標(biāo)右移n行 |
nD | 光標(biāo)左移n行 |
y; xH | 設(shè)置光標(biāo)位置 |
2J | 清屏 |
K | 清除從光標(biāo)到行尾的內(nèi)容 |
s | 保存光標(biāo)位置 |
u | 恢復(fù)光標(biāo)位置 |
?25l | 隱藏光標(biāo) |
?25h | 顯示光標(biāo) |
3. 示例
blabla一大堆,沒(méi)法理解,接下來(lái)用實(shí)例說(shuō)話,首先準(zhǔn)備一份已經(jīng)重定向printf到串口的工程,保證printf可以正常使用即可,并且使用終端軟件查看串口輸出(eg. Mobaxterm)。
① 打印沒(méi)有背景色,字體顏色為綠色,字體正常的字符:
printf("\033[32mHelloWorld\r\n");
編譯下載,即可看到效果:② 及時(shí)取消屬性
設(shè)置屬性之后,該屬性在終端中一直存在,必須要及時(shí)取消,比如在剛剛的printf之后,繼續(xù)正常打印,不加特殊字符,依然會(huì)打印綠色字符:
printf("\033[32mHelloWorld\r\n");
printf("HelloWorld 2\r\n");
printf("HelloWorld 3\r\n");
所以要在使用完畢后及時(shí)取消所有屬性設(shè)置,如下:
printf("\033[32mHelloWorld\033[0m\r\n");
printf("HelloWorld 2\r\n");
printf("HelloWorld 3\r\n");
③ 多個(gè)特殊字符一起設(shè)置
比如這里我同時(shí)設(shè)置打印顏色為綠色,字體在終端閃爍:
printf("\033[32;5mHelloWorld\033[0m\r\n");
怎么樣,在終端打印各種好玩的字符是不是非常簡(jiǎn)單~自己上手玩玩吧!
本文授權(quán)轉(zhuǎn)載自mculover666,作者:mculover666,作者博客見(jiàn)閱讀原文免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!