Linux终端和win32控制台文本颜色输出
在使用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转义序列。
1. 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 |
|
颜色 |
黑 |
红 |
绿 |
黄 |
蓝 |
紫 |
青 |
白 |
2. 各种语言输出颜色文本示例
除了shell命令可输出颜色,其它语言中也可以使用上述ANSI转义序列输出颜色(前提是你使用的终端仿真器能够解析ANSI转义序列),以下给出几种主要语言中输出颜色文本的示例。
注:以下程序仅针对类unix终端有效,win32控制台不支持ANSI转义序列,因而无效。
2.1 C程序输出颜色示例
// hello.c
#include <stdio.h>
int main() {
printf("\033[31;4mRed Underline Text\033[0m\n");
}
编译:gcc hello.c
运行:./a.out
输出:Red Underline Text
2.2 C++程序中输出颜色示例
// hello.cpp
#include <iostream>
int main() {
std::cout << "\033[31;4mRed Underline Text\033[0m" << std::endl;
}
编译:g++ hello.cpp
运行:./a.out
输出:Red Underline Text
2.3 Java程序中输出颜色示例
// hello.java
class hello {
public static void main(String[] args) {
System.out.println("\033[31;4mRed Underline Text\033[0m");
}
}
注:Java中不能识别\e和\0x1b,仅可使用\033。
编译:javac hello.java
运行:java hello
输出:Red Underline Text
2.4 Python程序中输出颜色示例
# hello.py
print "\033[31;4mRed Underline Text\033[0m"
注:python(v2.6.5)中不能识别\e,可以使用\033和\x1b。
运行:python hello.py
输出:Red Underline Text
3. win32控制台程序输出颜色
由于win32控制台不支持ANSI转义序列,因此要让win32控制台输出颜色文本相对复杂一些。
3.1 C/C++ windows程序控制台输出颜色
借助SetConsoleTextAttribute和GetStdHandle两个win32 API函数输出颜色,示例如下:
#include <stdio.h>
#include <windows.h> int main() {
HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hdl, FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("Hello ");
SetConsoleTextAttribute(hdl, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf("world!\n"); getchar();
}
其中用到的两个API原型如下:
HANDLE GetStdHandle(DWORD nStdHandle);
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
其中,GetStdHandle用于获取屏幕缓冲区句柄(示例中获取的是标准输出的句柄),SetConsoleTextAttribute用于设置控制台文本属性(第一次调用时设置前景色为红色高亮,第二次调用时设置为绿色高亮),因此输出结果为“Hello world!”。
GetStdHandle接口参数nStdHandle与接口返回值的含义如下:
|
值(nStdHandle) |
含义 |
|
STD_INPUT_HANDLE |
返回标准输入的句柄 |
|
STD_OUTPUT_HANDLE |
返回标准输出的句柄 |
|
STD_ERROR_HANDLE |
返回标准错误的句柄 |
注:更多信息请参考“GetStdHandle”。
SetConsoleTextAttribute()第一个参数hConsoleOutput为屏幕缓冲区句柄(可通过GetStdHandle()获取),第二个参数wAttributes为颜色属性。常用颜色属性值如下(可组合使用):
|
属性(wAttributes) |
说明 |
|
FOREGROUND_BLUE |
前景色(蓝色) |
|
FOREGROUND_GREEN |
前景色(绿色) |
|
FOREGROUND_RED |
前景色(红色) |
|
FOREGROUND_INTENSITY |
前景色高亮 |
|
BACKGROUND_BLUE |
背景色(蓝色) |
|
BACKGROUND_GREEN |
背景色(绿色) |
|
BACKGROUND_RED |
背景色(红色) |
|
BACKGROUND_INTENSITY |
背景色高亮 |
注:更多信息请参考“Console Screen Buffers”。
3.2 命令提示符下调整整屏颜色
命令提示符(CMD)下调整整屏颜色输出可使用color命令,格式如下:
color BF
其中B和F表示颜色属性(B背景色,F前景色),属性值为一个十六进制数字(0-F)。各属性值与颜色对应的关系如下:
|
属性值 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
颜色 |
黑 |
蓝 |
绿 |
水绿 |
红 |
紫 |
黄 |
白 |
|
属性值 |
8 |
9 |
A |
B |
C |
D |
E |
F |
|
颜色 |
灰 |
淡蓝 |
淡绿 |
淡水绿 |
淡红 |
淡紫 |
淡黄 |
亮白 |
例如,要设置命令提示符窗口“背景色为绿色,前景色为蓝色”可执行“color 21”。
3.3 PowerShell下输出字符颜色
可参考:PowerShell输出字符颜色
3.4 Python绑定windows接口输出显色
可参考:Python实现修改Windows CMD命令行输出颜色(完全解析)
Linux终端和win32控制台文本颜色输出的更多相关文章
- PS1应用之——修改linux终端命令行各字体颜色
最近在学习linux操作系统(CentOS 6 & CentOS 7).觉得linux终端命令行全部为白色,会经常导致命令与输出内容难以分辨.于是上网找到修改linux终端命令行颜色的方法,发 ...
- 修改linux终端命令行各字体颜色
这里我用的是 CentOS 7.5,觉得linux终端命令行全部为白色,会经常导致命令与输出内容难以分辨.于是上网找到修改linux终端命令行颜色的方法,发现通过定义PS1环境变量即可实现,下面我以r ...
- C#更改控制台文本颜色
C#更改控制台文本的前景色和背景色 关键字:C# NET 控制台 前景色 背景色地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/cshar ...
- Linux终端提示符PS1设置(颜色)
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"\H :完整的主机名称.例如:我的机器名称为:fc4.linux,则这个名称就是fc4.l ...
- 通过printf设置Linux终端输出的颜色和显示方式
转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...
- linux 终端输出颜色
在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据. 终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式 ...
- 花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量
背景 在日常操作Linux的情况下,总会遇到一些需求,比如说,把输出的内容用不同颜色标注出来,以达到醒目.提示的目的,那么如何在Linux终端输出带有颜色的字体呢? Linux终端输出字符颜色 ...
- ANSI最全介绍linux终端字体改变颜色等
ANSI转义序列 维基百科,自由的百科全书 由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此博客,方便国内用户参考,原地址(https://zh.wik ...
- linux终端颜色控制
引言: 由于在c代码中看到过打印彩色字, 又对PS1 想进一步了解,才有了这篇博文.----------------------------------------Linux 终端控制台字体颜色 - ...
随机推荐
- codeforces785E
http://codeforces.com/contest/785/problem/E 一道经典的求逆序对的题目,可以用树状数组套平衡树解决 平衡树需要支持插入一个数,删除一个数,找比 x 小的数的个 ...
- jquery源码解析:jQuery延迟对象Deferred(工具方法)详解2
请接着上一课继续看. $.Deferred()方法中,有两个对象,一个是deferred对象,一个是promise对象. promise对象有以下几个方法:state,always,then,prom ...
- [Ruby]Unzipping a file using rubyzip
link: http://www.markhneedham.com/blog/2008/10/02/ruby-unzipping-a-file-using-rubyzip/ require 'ruby ...
- Java编码转换
于Java当中,编码格式的转换一般较为麻烦,就我目前的经验来说,需要用到转码的环境主要是IO(无论是网络IO还是文件IO).转换方式主要有以下几种 方式一:String层面 String mes ...
- 安装Windows 64 位 mysql 最新版本解压包中没有data目录和my-default.ini及服务无法启动的快速解决办法
mysql官网下载地址:https://dev.mysql.com/downloads/mysql/ 首先安装包解压后,没有网上教程里面提到的data文件夹和my-default.ini 配置环境变量 ...
- archlinux安装tftp
1. 安装 [guo@archlinux ~]$ sudo pacman -S tftp-hpa 2. 启用 [guo@archlinux ~]$ systemctl start tftpd.se ...
- Hangfire项目
什么是Hangfire Hangfire 是一个开源的.NET任务调度框架,目前1.6+版本已支持.NET Core.个人认为它最大特点在于内置提供集成化的控制台,方便后台查看及监控: 另外,Hang ...
- zookeeper伪分布集群配置
1.上传tar文件zookeeper-3.4.12.tar.gz 2.解压zookeeper-3.4.12.tar.gz [root@localhost zookeeper]# .tar.gz 3.重 ...
- saltstack源码详解一
目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...
- SystemVerilog中枚举类型注意事项
enum logic {a = 'bx, d = 1'bz}; 在SystemVerilog枚举类型中当使用logic进行声明时,注意logic为四态,所以当使用时如果声明时需要x.z态需要显式声明. ...