如何在Linux终端输出带颜色的文本?

387

如何在支持彩色显示的Linux终端中打印彩色字符?

如何判断终端是否支持颜色代码?


9
要确定终端的功能,可以查看终端能力数据库。请参阅termcap(5) - jrockway
1
请随意查看我在这里发布的代码片段(https://dev59.com/H3VC5IYBdhLWcg3w9GA9#138528)。这是一个小工具,借助一些宏来为其输出着色。 - epatel
8
“termcap” 数据库是一个过时的设施,用于描述字符终端和打印机的功能。它仅保留用于与旧程序相兼容;新程序应使用 terminfo(5) 数据库和相关库。-- termcap(5) - OrangeDog
你可以轻松地使用 termcolor - Rudy Jessop
1
如果你想在颜色打印方面做一些高级的事情,我建议你阅读这篇文章:http://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html。我发现它非常有帮助。 - SubMachine
16个回答

3
你可以使用 ANSI 颜色代码。
使用以下函数。
enum c_color{BLACK=30,RED=31,GREEN=32,YELLOW=33,BLUE=34,MAGENTA=35,CYAN=36,WHITE=37};
enum c_decoration{NORMAL=0,BOLD=1,FAINT=2,ITALIC=3,UNDERLINE=4,RIVERCED=26,FRAMED=51};
void pr(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
  cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m";
}

void prl(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
   cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m"<<endl;
}

2
最好的方法是使用ncurses库 - 虽然如果您只想输出一个简单的带颜色的字符串,这可能是杀鸡焉用牛刀。

3
@Nick 如果仅仅是为了通过echo实现一些着色效果,使用ncurses会很麻烦。 :) - ring bearer

2
在Mac操作系统的终端中,以下命令可以实现此功能(包括在“红色文本”前面添加2个空格):
$ printf "\e[033;31m  red text\n"
$ echo "$(tput setaf 1)  red text"

楼主问如何在C++中改变颜色,而不是在某个未知的shell中改变颜色。 - undefined
抱歉,已修正以反映正确的命名,即在OSX终端模拟器中的BASH。 - undefined
许多笑声 - undefined

1

你可以直接编写控制颜色的 ANSI转义码,或者使用提供API的库,例如{fmt}。

例如:

#include <fmt/color.h>

int main() { 
  fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
             "Hello, {}!\n", "world");
}

打印

"Hello, world!" in crimson and bold

大多数现代终端支持ANSI转义序列,但您可以使用terminfo数据库进行检查。


0

我知道这个问题很旧,但我为未来的读者发布这个答案。我已经为C++编写了一个,用于彩色输出。它使用操纵符使工作变得容易,支持跨平台,但在这里没有测试。以下是如何使用它的概述:

#include "srilakshmikanthanp/ANSI.hpp"

using namespace srilakshmikanthanp;

3位和4位颜色:

// background
std::cout << ansi::BGyellow;
// foreground
std::cout << ansi::FGblue;
// output
std::cout << "Blue on yellow";
// reset
std::cout << ansi::reset;

8位色彩:

// background
std::cout << ansi::BGcolor(157);
// foreground
std::cout << ansi::FGcolor(100);
// outpt
std::cout << "8 bit color";
// reset
std::cout << ansi::reset;

24位色彩:

// background
std::cout << ansi::BGcolor(0, 255, 0);
// foreground
std::cout << ansi::FGcolor(0, 0, 255);
// output
std::cout << "24 bit color";
// reset
std::cout << ansi::reset;

转换为字符串:

您可以通过使用ansi::str轻松将此操纵器转换为字符串。

std::string BGyellow = ansi::str(ansi::BGyellow);
std::string FGblue = ansi::str(ansi::FGblue);
std::string reset = ansi::str(ansi::reset);

std::cout << BGyelow;
// foreground
std::cout << FGblue;
// output
std::cout << "Blue on Yellow";
// reset
std::cout << reset;

你可以在上面的链接中找到更多关于Github的信息 :)


0

我为此编写了一个跨平台库color_ostream,支持ANSI颜色、256色和真彩色,你只需要直接包含它并像这样将cout更改为rd_cout。

标准输出 基本颜色 256色 真彩色
std::cout color_ostream::rd_cout color_ostream::rd256_cout color_ostream::rdtrue_cout
std::wcout color_ostream::rd_wcout color_ostream::rd256_wcout color_ostream::rdtrue_wcout
std::cerr color_ostream::rd_cerr color_ostream::rd256_cerr color_ostream::rdtrue_cerr
std::wcerr color_ostream::rd_wcerr color_ostream::rd256_wcerr color_ostream::rdtrue_wcerr
std::clog color_ostream::rd_clog color_ostream::rd256_clog color_ostream::rdtrue_clog
std::wclog color_ostream::rd_wclog color_ostream::rd256_wclog color_ostream::rdtrue_wclog

这里是一个简单的例子:

//hello.cpp
#include "color_ostream.h"

using namespace color_ostream;

int main([[maybe_unused]] int argc, [[maybe_unused]] char *argv[]) {
    rd_wcout.imbue(std::locale(std::locale(),"",LC_CTYPE));
    rd_wcout << L"Hello world\n";
    rd_wcout << L"Hola Mundo\n";
    rd_wcout << L"Bonjour le monde\n";

    rd256_wcout << L"\n256 color" << std::endl;
    rd256_wcout << L"Hello world\n";
    rd256_wcout << L"Hola Mundo\n";
    rd256_wcout << L"Bonjour le monde\n";

    rdtrue_wcout << L"\ntrue color" << std::endl;
    rdtrue_wcout << L"Hello world\n";
    rdtrue_wcout << L"Hola Mundo\n";
    rdtrue_wcout << L"Bonjour le monde\n";
    return 0;
}

我的图表显示不正确,有人可以帮我吗? - Wongboo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接