如何将彩色字符打印到支持彩色字符的Linux终端?
如何判断终端是否支持颜色码?
如何将彩色字符打印到支持彩色字符的Linux终端?
如何判断终端是否支持颜色码?
当前回答
我使用下面的解决方案,它非常简单和优雅,可以很容易地粘贴到源代码中,并在Linux/Bash上工作:
const std::string red("\033[0;31m");
const std::string green("\033[1;32m");
const std::string yellow("\033[1;33m");
const std::string cyan("\033[0;36m");
const std::string magenta("\033[0;35m");
const std::string reset("\033[0m");
std::cout << "Measured runtime: " << yellow << timer.count() << reset << std::endl;
其他回答
基础知识
我写了一个c++类,可以用来设置输出的前景色和背景色。这个示例程序用作打印This ->单词<-是红色的示例。格式化它,使单词的前景色为红色。
#include "colormod.h" // namespace Color
#include <iostream>
using namespace std;
int main() {
Color::Modifier red(Color::FG_RED);
Color::Modifier def(Color::FG_DEFAULT);
cout << "This ->" << red << "word" << def << "<- is red." << endl;
}
源
#include <ostream>
namespace Color {
enum Code {
FG_RED = 31,
FG_GREEN = 32,
FG_BLUE = 34,
FG_DEFAULT = 39,
BG_RED = 41,
BG_GREEN = 42,
BG_BLUE = 44,
BG_DEFAULT = 49
};
class Modifier {
Code code;
public:
Modifier(Code pCode) : code(pCode) {}
friend std::ostream&
operator<<(std::ostream& os, const Modifier& mod) {
return os << "\033[" << mod.code << "m";
}
};
}
先进的
您可能希望向该类添加其他特性。它是,例如,可以添加颜色洋红色,甚至样式像粗体。要做到这一点,只需在Code枚举中添加另一个条目。这是一个很好的参考。
在OSX shell上,这为我工作(包括“红色文本”前面的2个空格):
$ printf "\e[033;31m red text\n"
$ echo "$(tput setaf 1) red text"
最好的方法是使用ncurses库——尽管如果你只是想输出一个简单的彩色字符串,这可能是一个大锤来敲坚果
正如其他人所述,您可以使用转义字符。 你可以使用我的标题,以使它更容易:
#ifndef _COLORS_
#define _COLORS_
/* FOREGROUND */
#define RST "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
#define FRED(x) KRED x RST
#define FGRN(x) KGRN x RST
#define FYEL(x) KYEL x RST
#define FBLU(x) KBLU x RST
#define FMAG(x) KMAG x RST
#define FCYN(x) KCYN x RST
#define FWHT(x) KWHT x RST
#define BOLD(x) "\x1B[1m" x RST
#define UNDL(x) "\x1B[4m" x RST
#endif /* _COLORS_ */
使用header的宏的一个例子可以是:
#include <iostream>
#include "colors.h"
using namespace std;
int main()
{
cout << FBLU("I'm blue.") << endl;
cout << BOLD(FBLU("I'm blue-bold.")) << endl;
return 0;
}
从我的理解,一个典型的ANSI颜色代码
"\033[{FORMAT_ATTRIBUTE};{FORGROUND_COLOR};{BACKGROUND_COLOR}m{TEXT}\033[{RESET_FORMATE_ATTRIBUTE}m"
由(名称和编解码器)组成
FORMAT ATTRIBUTE { "Default", "0" }, { "Bold", "1" }, { "Dim", "2" }, { "Italics", "3"}, { "Underlined", "4" }, { "Blink", "5" }, { "Reverse", "7" }, { "Hidden", "8" } FORGROUND COLOR { "Default", "39" }, { "Black", "30" }, { "Red", "31" }, { "Green", "32" }, { "Yellow", "33" }, { "Blue", "34" }, { "Magenta", "35" }, { "Cyan", "36" }, { "Light Gray", "37" }, { "Dark Gray", "90" }, { "Light Red", "91" }, { "Light Green", "92" }, { "Light Yellow", "93" }, { "Light Blue", "94" }, { "Light Magenta", "95" }, { "Light Cyan", "96" }, { "White", "97" } BACKGROUND COLOR { "Default", "49" }, { "Black", "40" }, { "Red", "41" }, { "Green", "42" }, { "Yellow", "43" }, { "Blue", "44" }, { "Megenta", "45" }, { "Cyan", "46" }, { "Light Gray", "47" }, { "Dark Gray", "100" }, { "Light Red", "101" }, { "Light Green", "102" }, { "Light Yellow", "103" }, { "Light Blue", "104" }, { "Light Magenta", "105" }, { "Light Cyan", "106" }, { "White", "107" } TEXT RESET FORMAT ATTRIBUTE { "All", "0" }, { "Bold", "21" }, { "Dim", "22" }, { "Underlined", "24" }, { "Blink", "25" }, { "Reverse", "27" }, { "Hidden", "28" }
有了这些信息,就很容易给字符串“I am a banana!”上色,前景色为“黄色”,背景色为“绿色”,就像这样
"\033[0;33;42mI am a Banana!\033[0m"
或者用c++库着色
auto const& colorized_text = color::rize( "I am a banana!", "Yellow", "Green" );
std::cout << colorized_text << std::endl;
更多关于FORMAT ATTRIBUTE的例子