zoukankan      html  css  js  c++  java
  • 在终端控制台输出带颜色的文本

    Linux下终端控制台字体颜色

    在使用putty、secureCRT、XShell等终端仿真器连接linux系统时,ls、vim等工具的输出都含有各种颜色,这些颜色的输出大大地增强了文本的可读性。
    通常我们可以使用echo命令加-e选项输出各种颜色的文本,例如:echo -e "33[31mRed Text33[0m",可以输出红色的字体“Red Text”。其中:"33[31m"和"33[0m"是ANSI转义序列(ANSI escape code/sequence),它控制文本输出的格式、颜色等,大多数的类unix终端仿真器都能够解释ANSI转义序列。

    通用的控制文本颜色的转义序列格式如下:

        CSI n1 [;n2 [;…]] m

    其中CSI全称为“控制序列引导器”(Control Sequence Introducer/Initiator),也就是上述示例中的"33["(其中33是你键盘左上角Esc键对应的ascii码(八进制));n1、n2等表示SGR参数(下面会列出一些常用的SGR参数),用于控制颜色、粗体、斜体、闪烁等文本输出格式;m表示转义序列结束。

    注:33是键盘左上角Esc键对应的ASCII码(8进制),33、x1b和e效果一样, 例如:echo -e "x1b[31mRed Texte[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 Texte[0m"输出红色下划线字体“Red Underline Text”。

        (3)更多参数信息请参考“ANSI escape code”。

    颜色表:

    颜色值x 0 1 2 3 4 5 6 7
    颜色 绿

     

    演示代码非常简单,直接按照上面组合输入就行:

    fmt.Println("33[31;4mRed Underline Text33[0m ")

    下面有对这个功能的简单封装:

    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 ", color)
            fmt.Printf("Press any key to continue ")
            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/

  • 相关阅读:
    动态规划-树形dp
    排队打水
    耍杂技的牛
    合并果子
    贪心问题-区间类
    动态规划-状态压缩dp
    Linux分区知识及企业场景分区76
    企业面试题-find结合sed查找替换
    企业面试题-利用三剑客
    alias-unalias
  • 原文地址:https://www.cnblogs.com/ghj1976/p/4242017.html
Copyright © 2011-2022 走看看