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






