我需要能够在终端上制作一些文字更加引人注目,而我想的是使文字变成彩色。无论是实际文本,还是每个字母的矩形空间(想想vi的光标)。我认为对我的应用程序来说重要的两个额外规格是:程序应该是独立于发行版的(确定代码只能在BASH下运行),并且在写入文件时不应输出额外的字符(来自实际代码,或管道输出时)
我在网上搜索了一些信息,但我只能找到弃用的cstdlib(stdlib.h)的信息,我需要(实际上,它更像是“想要”)使用iostream的功能来完成它。
答案 0 :(得分:13)
大多数终端都遵循ASCII颜色序列。他们的工作方式是输出ESC
,然后输出[
,然后输出以分号分隔的颜色值列表,然后输出m
。这些是常见的值:
Special
0 Reset all attributes
1 Bright
2 Dim
4 Underscore
5 Blink
7 Reverse
8 Hidden
Foreground colors
30 Black
31 Red
32 Green
33 Yellow
34 Blue
35 Magenta
36 Cyan
37 White
Background colors
40 Black
41 Red
42 Green
43 Yellow
44 Blue
45 Magenta
46 Cyan
47 White
因此,输出"\033[31;47m"
应使终端前(文本)颜色为红色,背景颜色为白色。
你可以很好地用C ++形式包装它:
enum Color {
NONE = 0,
BLACK, RED, GREEN,
YELLOW, BLUE, MAGENTA,
CYAN, WHITE
}
std::string set_color(Color foreground = 0, Color background = 0) {
char num_s[3];
std::string s = "\033[";
if (!foreground && ! background) s += "0"; // reset colors if no params
if (foreground) {
itoa(29 + foreground, num_s, 10);
s += num_s;
if (background) s += ";";
}
if (background) {
itoa(39 + background, num_s, 10);
s += num_s;
}
return s + "m";
}
答案 1 :(得分:4)
以上是来自@nightcracker的上述代码版本,使用stringstream
代替itoa
。 (这使用clang ++,C ++ 11,OS X 10.7,iTerm2,bash运行)
#include <iostream>
#include <string>
#include <sstream>
enum Color
{
NONE = 0,
BLACK, RED, GREEN,
YELLOW, BLUE, MAGENTA,
CYAN, WHITE
};
static std::string set_color(Color foreground = NONE, Color background = NONE)
{
std::stringstream s;
s << "\033[";
if (!foreground && ! background){
s << "0"; // reset colors if no params
}
if (foreground) {
s << 29 + foreground;
if (background) s << ";";
}
if (background) {
s << 39 + background;
}
s << "m";
return s.str();
}
int main(int agrc, char* argv[])
{
std::cout << "These words should be colored [ " <<
set_color(RED) << "red " <<
set_color(GREEN) << "green " <<
set_color(BLUE) << "blue" <<
set_color() << " ]" <<
std::endl;
return EXIT_SUCCESS;
}
答案 2 :(得分:2)
您可能需要查看VT100 control codes。
答案 3 :(得分:0)
您还可以制作自定义功能:
void textcolor(int color)
{
std::cout<<"\033]"<<color;
}
答案 4 :(得分:0)
您可以从github(https://github.com/Spezialcoder/libcolor)使用libcolor
#include "libcolor/libcolor.h"
#include <iostream>
using namespace std;
int main()
{
cout << font_color::green << "Hello World" << endl;
}