在終端控制台輸出帶顏色的文本


Linux下終端控制台字體顏色

在使用putty、secureCRT、XShell等終端仿真器連接linux系統時,ls、vim等工具的輸出都含有各種顏色,這些顏色的輸出大大地增強了文本的可讀性。
通常我們可以使用echo命令加-e選項輸出各種顏色的文本,例如:echo -e "\033[31mRed Text\033[0m",可以輸出紅色的字體“Red Text”。其中:"\033[31m"和"\033[0m"是ANSI轉義序列(ANSI escape code/sequence),它控制文本輸出的格式、顏色等,大多數的類unix終端仿真器都能夠解釋ANSI轉義序列。

通用的控制文本顏色的轉義序列格式如下:

    CSI n1 [;n2 [;…]] m

其中CSI全稱為“控制序列引導器”(Control Sequence Introducer/Initiator),也就是上述示例中的"\033["(其中\033是你鍵盤左上角Esc鍵對應的ascii碼(八進制));n1、n2等表示SGR參數(下面會列出一些常用的SGR參數),用於控制顏色、粗體、斜體、閃爍等文本輸出格式;m表示轉義序列結束。

注:\033是鍵盤左上角Esc鍵對應的ASCII碼(8進制),\033、\x1b和\e效果一樣, 例如:echo -e "\x1b[31mRed Text\e[0m"也輸出紅色字體“Red Text”。

 

常用的SRG參數列表如下:

編碼 說明
0 關閉所有格式,還原為初始狀態
1 粗體/高亮顯示
2 模糊(
3 斜體(
4 下划線(單線)
5 閃爍(慢)
6 閃爍(快)(
7 交換背景色與前景色
8 隱藏(伸手不見五指,啥也看不見)(
30-37 前景色,即30+x,x表示不同的顏色(參見下面的“顏色表”)
40-47 背景色,即40+x,x表示不同的顏色(參見下面的“顏色表”)

 

注:(1)其中含有(※)標注的編碼表示不是所有的終端仿真器都支持,只有少數仿真器支持。

    (2)多個SGR參數可以組合使用,例如:echo -e "\x1b[31;4mRed Underline Text\e[0m"輸出紅色下划線字體“Red Underline Text”。

    (3)更多參數信息請參考“ANSI escape code”。

顏色表:

顏色值x 0 1 2 3 4 5 6 7
顏色

 

演示代碼非常簡單,直接按照上面組合輸入就行:

fmt.Println("\033[31;4mRed Underline Text\033[0m\n")

下面有對這個功能的簡單封裝:

https://github.com/xcltapestry/xclpkg/blob/master/clcolor/clcolor.go

 

 

參考資料:

Linux終端輸出顏色控制
http://blog.chinaunix.net/uid-29555318-id-4479619.html

給終端來點彩色(c語言和Golang版)
http://studygolang.com/articles/2032

Linux終端輸出顏色控制
http://ju.outofmemory.cn/entry/26528

 

WIN下終端控制台字體顏色

win控制台不支持ANSI轉義序列,因此要讓win32控制台輸出顏色文本相對復雜一些。

這里我們借助SetConsoleTextAttribute和GetStdHandle兩個win32 API函數輸出顏色,示例如下:

WIN下控制台輸出帶顏色的文本:

代碼:

package main

import (
    "fmt"
    "syscall"
)

type (
    HANDLE uintptr
    WORD   uint16
    DWORD  uint32
)

const (
    STD_OUTPUT_HANDLE    = 0xFFFFFFF5
    FOREGROUND_BLUE      = 0x01
    FOREGROUND_GREEN     = 0x02
    FOREGROUND_RED       = 0x04
    FOREGROUND_INTENSITY = 0x08
    BACKGROUND_BLUE      = 0x10
    BACKGROUND_GREEN     = 0x20
    BACKGROUND_RED       = 0x40
    BACKGROUND_INTENSITY = 0x80
)

var (
    modkernel32                 = syscall.NewLazyDLL("kernel32.dll")
    procGetStdHandle            = modkernel32.NewProc("GetStdHandle")
    procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
)

func GetStdHandle(nStdHandle DWORD) HANDLE {
    ret, _, _ := procGetStdHandle.Call(uintptr(nStdHandle))
    return HANDLE(ret)
}
func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes WORD) bool {
    ret, _, _ := procSetConsoleTextAttribute.Call(
        uintptr(hConsoleOutput),
        uintptr(wAttributes))
    return ret != 0
}
func main() {
    for color := 0; color < 8; color++ {
        textbackground(color)
        fmt.Printf("This is color %d\n", color)
        fmt.Printf("Press any key to continue\n")
        fmt.Scanln()
    }
}
func textbackground(color int) {
    hOut := GetStdHandle(STD_OUTPUT_HANDLE)
    SetConsoleTextAttribute(hOut, WORD(color))
}

執行效果截圖:

image

 

參考資料:

Python實現修改Windows CMD命令行輸出顏色(完全解析)
http://my.oschina.net/bluefly/blog/311209

Linux終端和win32控制台文本顏色輸出
http://www.cnblogs.com/crabxx/p/4046498.html

Golang如何在終端輸出帶顏色的字體?
http://www.epooll.com/archives/770/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM