Untuk menentukan kemampuan terminal, periksa basis data kemampuan terminal. lihat termcap(5).
jrockway
1
Jangan ragu untuk melihat potongan kode yang saya taruh di sini . Ini adalah alat kecil yang mewarnai hasilnya dengan bantuan beberapa makro.
epatel
7
"Database termcap adalah fasilitas usang untuk menggambarkan kemampuan terminal sel-karakter dan printer. Itu dipertahankan hanya untuk kemampuan dengan program-program lama; yang baru harus menggunakan terminfo(5)database dan perpustakaan terkait." -termcap(5)
Jika Anda ingin melakukan beberapa hal lanjut dengan pencetakan warna, saya sarankan Anda membaca artikel ini . Saya merasa sangat membantu
SubMachine
Jawaban:
408
Anda perlu menampilkan kode warna ANSI . Perhatikan bahwa tidak semua terminal mendukung ini; jika urutan warna tidak didukung, sampah akan muncul.
Contoh:
cout <<"\033[1;31mbold red text\033[0m\n";
Di sini, \033adalah karakter ESC, ASCII 27. Diikuti oleh [, kemudian nol atau lebih angka yang dipisahkan oleh ;, dan akhirnya huruf m. Angka-angka menggambarkan warna dan format untuk beralih dari titik itu dan seterusnya.
Kode untuk warna foreground dan background adalah:
foreground background
black 3040
red 3141
green 3242
yellow 3343
blue 3444
magenta 3545
cyan 3646
white 3747
Selain itu, Anda dapat menggunakan ini:
reset 0(everything back to normal)
bold/bright 1(often a brighter shade of the same colour)
underline 4
inverse 7(swap foreground and background colours)
bold/bright off 21
underline off 24
inverse off 27
Lihat tabel di Wikipedia untuk kode lain yang kurang didukung secara luas.
Untuk menentukan apakah terminal Anda mendukung urutan warna, baca nilai TERMvariabel lingkungan. Ini harus menentukan jenis terminal tertentu yang digunakan (misalnya vt100, gnome-terminal, xterm, screen, ...). Kemudian lihat di database terminfo ; periksa colorskapabilitas.
Saya telah menulis kelas C ++ yang dapat digunakan untuk mengatur warna foreground dan background dari output. Program sampel ini berfungsi sebagai contoh mencetak This ->word<- is red.dan memformatnya sehingga warna latar depan wordmerah.
#include"colormod.h"// namespace Color#include<iostream>usingnamespace std;int main(){Color::Modifier red(Color::FG_RED);Color::Modifier def(Color::FG_DEFAULT);
cout <<"This ->"<< red <<"word"<< def <<"<- is red."<< endl;}
Anda mungkin ingin menambahkan fitur tambahan ke kelas. Sebagai contoh, dimungkinkan untuk menambahkan warna magenta dan bahkan gaya seperti huruf tebal . Untuk melakukan ini, hanya entri lain ke Codeenumerasi. Ini referensi yang bagus.
Jika Anda menentukan operator<<untuk Code, maka Anda langsung dapat menulis std::cout << Color::FG_RED;bukan std::cout << Modifier(Color::FG_RED);. Itu Modifiertidak dibutuhkan.
Nawaz
2
@Nawaz Ide bagus. Berikut ini adalah implementasi seperti itu: pastebin.com/zWC3t9hC . Namun saya akan tetap menerapkan yang asli dalam jawaban karena saya merasa itu lebih dapat diperluas.
Joel Sjögren
1
Sebenarnya saya lebih suka implementasi pertama karena Anda dapat menambahkan bendera untuk menghidupkan atau mematikan warna: Tambahkan bool sh;ke kelas dan ubah konstruktor menjadi Modifier (Code pCode, bool show = true) : code(pCode), sh(show) {}. Akhirnya, di tubuh <<operator mengembalikan garis saat ini if (sh)dan return << os;sebaliknya. Ini memungkinkan Anda menulis kode dengan Color::Modifier red(Color::FG_RED, BoolVar);mana Anda dapat menetapkan BoolVartrue atau false sebagai inisialisasi program. Anda dapat menyalakannya untuk melihatnya di layar dan mematikan untuk mengarahkan ulang ke file.
rpsml
42
Sebelum Anda menampilkan warna apa pun yang Anda butuhkan, pastikan Anda berada di terminal:
[-t 1]&& echo 'Yes I am in a terminal'# isatty(3) call in C
Maka Anda perlu memeriksa kapabilitas terminal jika mendukung warna
pada sistem dengan terminfo(berbasis Linux) Anda dapat memperoleh jumlah warna yang didukung sebagai
Number_Of_colors_Supported=$(tput colors)
pada sistem dengan termcap(berbasis BSD) Anda dapat memperoleh jumlah warna yang didukung sebagai
Number_Of_colors_Supported=$(tput Co)
Lalu buat keputusan:
[ ${Number_Of_colors_Supported}-ge 8]&&{
echo 'You are fine and can print colors'}||{
echo 'Terminal does not support color'}
BTW, jangan gunakan pewarnaan seperti yang disarankan sebelumnya dengan karakter ESC. Gunakan panggilan standar ke kemampuan terminal yang akan memberi Anda warna BENAR yang didukung terminal tertentu.
Berbasis BSD
fg_black="$(tput AF 0)"
fg_red="$(tput AF 1)"
fg_green="$(tput AF 2)"
fg_yellow="$(tput AF 3)"
fg_blue="$(tput AF 4)"
fg_magenta="$(tput AF 5)"
fg_cyan="$(tput AF 6)"
fg_white="$(tput AF 7)"
reset="$(tput me)"
Bukankah ini spesifik bash? -t 1 jelas tidak akan bekerja di C ++, dan memanggil program tput ini akan membuatnya sangat bundar ketika berada dalam program C ++.
Macha
2
@ Macha, ya, [ -t 1 ]ini spesifik sh / bash, tetapi di sisi kanan setelah #(comment)tanda ada fungsi C yang melakukan hal yang sama. man 3 isattyharus membantu dalam hal ini;) Contoh yang ditampilkan sebagai perintah shell untuk menyederhanakan penjelasan tentang poin utama. Mengenai tpututilitas sumber OPEN itu untuk menanyakan antarmuka kemampuan terminal standar.
Alex
1
Saya tidak yakin mengapa orang terus menyarankan untuk menggunakan kode-kode itu secara langsung. Ini benar-benar, praktik yang sangat buruk untuk membuat asumsi seperti itu. Bahkan jika ini adalah kode khusus shell, ini dapat diterjemahkan oleh siapa pun yang memiliki pengalaman shell baru sekalipun.
osirisgothra
34
Seperti yang dinyatakan orang lain, Anda dapat menggunakan karakter melarikan diri. Anda dapat menggunakan header saya untuk membuatnya lebih mudah:
#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_ */
Dengan informasi ini, mudah untuk memberi warna pada string "Saya seorang pisang!" dengan warna forground "Kuning" dan warna latar belakang "Hijau" seperti ini
Ini jauh lebih baik dan saya dapat menggunakannya di PHP C ++ Extension saya.
Aftab Naveed
12
Ini adalah topik lama, tapi saya menulis kelas dengan subclass bersarang dan anggota statis untuk warna yang ditentukan oleh makro C sederhana.
Saya mendapatkan colorfungsi dari posting ini Color Text In C Programming di dreamincode.net oleh pengguna no2pencil.
Saya membuatnya dengan cara ini agar dapat menggunakan konstanta statis di std :: cout stream seperti ini:
cout << zkr::cc::fore::red <<"This is red text. "<< zkr::cc::console <<"And changing to console default colors, fg, bg."<< endl;
Kelas dan kode sumber program pengujian dapat diunduh di sini .
cc::consoleakan mengatur ulang ke konsol warna dan atribut default, cc::underlineakan menggarisbawahi teks, yang berfungsi pada dempul yang telah saya uji program pengujian.
Warna:
black
blue
red
magenta
green
cyan
yellow
white
lightblack
lightblue
lightred
lightmagenta
lightgreen
lightcyan
lightyellow
lightwhite
Yang dapat digunakan dengan kedua foredan backsubclass statis dari cckelas statis.
EDIT 2017
Saya hanya menambahkan kode kelas di sini agar lebih praktis.
dan fungsi warna utama yang menentukan warna atau atribut ke layar:
char*cc::color(int attr,int fg,int bg){staticchar command[13];/* Command is the control command to the terminal */
sprintf(command,"%c[%d;%d;%dm",0x1B, attr, fg +30, bg +40);return command;}
ccolor.h
#include<stdio.h>#define CC_CONSOLE_COLOR_DEFAULT "\033[0m"#define CC_FORECOLOR(C)"\033["#C "m"#define CC_BACKCOLOR(C)"\033["#C "m"#define CC_ATTR(A)"\033["#A "m"namespace zkr
{class cc
{public:class fore
{public:staticconstchar*black;staticconstchar*blue;staticconstchar*red;staticconstchar*magenta;staticconstchar*green;staticconstchar*cyan;staticconstchar*yellow;staticconstchar*white;staticconstchar*console;staticconstchar*lightblack;staticconstchar*lightblue;staticconstchar*lightred;staticconstchar*lightmagenta;staticconstchar*lightgreen;staticconstchar*lightcyan;staticconstchar*lightyellow;staticconstchar*lightwhite;};class back
{public:staticconstchar*black;staticconstchar*blue;staticconstchar*red;staticconstchar*magenta;staticconstchar*green;staticconstchar*cyan;staticconstchar*yellow;staticconstchar*white;staticconstchar*console;staticconstchar*lightblack;staticconstchar*lightblue;staticconstchar*lightred;staticconstchar*lightmagenta;staticconstchar*lightgreen;staticconstchar*lightcyan;staticconstchar*lightyellow;staticconstchar*lightwhite;};staticchar*color(int attr,int fg,int bg);staticconstchar*console;staticconstchar*underline;staticconstchar*bold;};}
//// COLORS.h//// Posted by Gon1332 May 15 2015 on StackOverflow// /programming/2616906/how-do-i-output-coloured-text-to-a-linux-terminal#2616912//// Description: An easy header file to make colored text output to terminal second nature.// Modified by Shades Aug. 14 2018// PLEASE carefully read comments before using this tool, this will save you a lot of bugs that are going to be just about impossible to find.#ifndef COLORS_h
#define COLORS_h
/* FOREGROUND */// These codes set the actual text to the specified color#define RESETTEXT "\x1B[0m"// Set all colors back to normal.#define FOREBLK "\x1B[30m"// Black#define FORERED "\x1B[31m"// Red#define FOREGRN "\x1B[32m"// Green#define FOREYEL "\x1B[33m"// Yellow#define FOREBLU "\x1B[34m"// Blue#define FOREMAG "\x1B[35m"// Magenta#define FORECYN "\x1B[36m"// Cyan#define FOREWHT "\x1B[37m"// White/* BACKGROUND */// These codes set the background color behind the text.#define BACKBLK "\x1B[40m"#define BACKRED "\x1B[41m"#define BACKGRN "\x1B[42m"#define BACKYEL "\x1B[43m"#define BACKBLU "\x1B[44m"#define BACKMAG "\x1B[45m"#define BACKCYN "\x1B[46m"#define BACKWHT "\x1B[47m"// These will set the text color and then set it back to normal afterwards.#define BLK(x) FOREBLK x RESETTEXT
#define RED(x) FORERED x RESETTEXT
#define GRN(x) FOREGRN x RESETTEXT
#define YEL(x) FOREYEL x RESETTEXT
#define BLU(x) FOREBLU x RESETTEXT
#define MAG(x) FOREMAG x RESETTEXT
#define CYN(x) FORECYN x RESETTEXT
#define WHT(x) FOREWHT x RESETTEXT
// Example usage: cout << BLU("This text's color is now blue!") << endl;// These will set the text's background color then reset it back.#defineBackBLK(x) BACKBLK x RESETTEXT
#defineBackRED(x) BACKRED x RESETTEXT
#defineBackGRN(x) BACKGRN x RESETTEXT
#defineBackYEL(x) BACKYEL x RESETTEXT
#defineBackBLU(x) BACKBLU x RESETTEXT
#defineBackMAG(x) BACKMAG x RESETTEXT
#defineBackCYN(x) BACKCYN x RESETTEXT
#defineBackWHT(x) BACKWHT x RESETTEXT
// Example usage: cout << BACKRED(FOREBLU("I am blue text on a red background!")) << endl;// These functions will set the background to the specified color indefinitely.// NOTE: These do NOT call RESETTEXT afterwards. Thus, they will set the background color indefinitely until the user executes cout << RESETTEXT// OR if a function is used that calles RESETTEXT i.e. cout << RED("Hello World!") will reset the background color since it calls RESETTEXT.// To set text COLOR indefinitely, see SetFore functions below.#defineSetBackBLK BACKBLK
#defineSetBackRED BACKRED
#defineSetBackGRN BACKGRN
#defineSetBackYEL BACKYEL
#defineSetBackBLU BACKBLU
#defineSetBackMAG BACKMAG
#defineSetBackCYN BACKCYN
#defineSetBackWHT BACKWHT
// Example usage: cout << SetBackRED << "This text's background and all text after it will be red until RESETTEXT is called in some way" << endl;// These functions will set the text color until RESETTEXT is called. (See above comments)#defineSetForeBLK FOREBLK
#defineSetForeRED FORERED
#defineSetForeGRN FOREGRN
#defineSetForeYEL FOREYEL
#defineSetForeBLU FOREBLU
#defineSetForeMAG FOREMAG
#defineSetForeCYN FORECYN
#defineSetForeWHT FOREWHT
// Example usage: cout << SetForeRED << "This text and all text after it will be red until RESETTEXT is called in some way" << endl;#define BOLD(x)"\x1B[1m" x RESETTEXT // Embolden text then reset it.#define BRIGHT(x)"\x1B[1m" x RESETTEXT // Brighten text then reset it. (Same as bold but is available for program clarity)#define UNDL(x)"\x1B[4m" x RESETTEXT // Underline text then reset it.// Example usage: cout << BOLD(BLU("I am bold blue text!")) << endl;// These functions will embolden or underline text indefinitely until RESETTEXT is called in some way.#defineSetBOLD"\x1B[1m"// Embolden text indefinitely.#defineSetBRIGHT"\x1B[1m"// Brighten text indefinitely. (Same as bold but is available for program clarity)#defineSetUNDL"\x1B[4m"// Underline text indefinitely.// Example usage: cout << setBOLD << "I and all text after me will be BOLD/Bright until RESETTEXT is called in some way!" << endl;#endif/* COLORS_h */
Seperti yang Anda lihat, ia memiliki lebih banyak kemampuan seperti kemampuan untuk mengatur warna latar belakang sementara, tanpa batas waktu, dan fitur lainnya. Saya juga percaya ini sedikit lebih ramah pemula dan lebih mudah mengingat semua fungsi.
#include<iostream>#include"COLORS.h"int main(){
std::cout <<SetBackBLU<<SetForeRED<< endl;
std::cout <<"I am red text on a blue background! :) "<< endl;return0;}
Cukup sertakan file header di proyek Anda dan Anda siap untuk bergoyang-goyang dengan output terminal berwarna.
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
Format:
Format Umum, termasuk nilai yang Anda inginkan dalam $ variabel $
COLOR_$Foreground_Color$_$Background_Color$
COLOR_$Text_Attribute$_$Foreground_Color$_$Background_Color$
COLOR_NORMAL // To set color to default
misalnya
COLOR_BLUE_BLACK // Leave Text Attribute Blank if no Text Attribute appied
COLOR_UNDERSCORE_YELLOW_RED
COLOR_NORMAL
Pemakaian:
Cukup gunakan untuk mengalirkan warna yang Anda inginkan sebelum menghasilkan teks dan gunakan lagi untuk mengatur warna ke normal setelah menghasilkan teks.
Cara terbaik adalah dengan menggunakan perpustakaan ncurses - meskipun ini mungkin palu untuk memecahkan masalah jika Anda hanya ingin menghasilkan string berwarna sederhana
termcap(5)
.terminfo(5)
database dan perpustakaan terkait." -termcap(5)
Jawaban:
Anda perlu menampilkan kode warna ANSI . Perhatikan bahwa tidak semua terminal mendukung ini; jika urutan warna tidak didukung, sampah akan muncul.
Contoh:
Di sini,
\033
adalah karakter ESC, ASCII 27. Diikuti oleh[
, kemudian nol atau lebih angka yang dipisahkan oleh;
, dan akhirnya hurufm
. Angka-angka menggambarkan warna dan format untuk beralih dari titik itu dan seterusnya.Kode untuk warna foreground dan background adalah:
Selain itu, Anda dapat menggunakan ini:
Lihat tabel di Wikipedia untuk kode lain yang kurang didukung secara luas.
Untuk menentukan apakah terminal Anda mendukung urutan warna, baca nilai
TERM
variabel lingkungan. Ini harus menentukan jenis terminal tertentu yang digunakan (misalnyavt100
,gnome-terminal
,xterm
,screen
, ...). Kemudian lihat di database terminfo ; periksacolors
kapabilitas.sumber
m
/ berdiri untuk?\033[
danm
tandai awal dan akhir urutan pelarian untuk kode warna ANSI. Ref: en.wikipedia.org/wiki/ANSI_escape_code#CSI_codesconst std::string red("\033[0;31m");
atauconst std::string reset("\033[0m");
. Lalu, saya bisa menulis sederhanacout << red << "red text" << reset << endl;
.Dasar-dasar
Saya telah menulis kelas C ++ yang dapat digunakan untuk mengatur warna foreground dan background dari output. Program sampel ini berfungsi sebagai contoh mencetak
This ->word<- is red.
dan memformatnya sehingga warna latar depanword
merah.Sumber
Maju
Anda mungkin ingin menambahkan fitur tambahan ke kelas. Sebagai contoh, dimungkinkan untuk menambahkan warna magenta dan bahkan gaya seperti huruf tebal . Untuk melakukan ini, hanya entri lain ke
Code
enumerasi. Ini referensi yang bagus.sumber
operator<<
untukCode
, maka Anda langsung dapat menulisstd::cout << Color::FG_RED;
bukanstd::cout << Modifier(Color::FG_RED);
. ItuModifier
tidak dibutuhkan.bool sh;
ke kelas dan ubah konstruktor menjadiModifier (Code pCode, bool show = true) : code(pCode), sh(show) {}
. Akhirnya, di tubuh<<
operator mengembalikan garis saat iniif (sh)
danreturn << os;
sebaliknya. Ini memungkinkan Anda menulis kode denganColor::Modifier red(Color::FG_RED, BoolVar);
mana Anda dapat menetapkanBoolVar
true atau false sebagai inisialisasi program. Anda dapat menyalakannya untuk melihatnya di layar dan mematikan untuk mengarahkan ulang ke file.Sebelum Anda menampilkan warna apa pun yang Anda butuhkan, pastikan Anda berada di terminal:
Maka Anda perlu memeriksa kapabilitas terminal jika mendukung warna
pada sistem dengan
terminfo
(berbasis Linux) Anda dapat memperoleh jumlah warna yang didukung sebagaipada sistem dengan
termcap
(berbasis BSD) Anda dapat memperoleh jumlah warna yang didukung sebagaiLalu buat keputusan:
BTW, jangan gunakan pewarnaan seperti yang disarankan sebelumnya dengan karakter ESC. Gunakan panggilan standar ke kemampuan terminal yang akan memberi Anda warna BENAR yang didukung terminal tertentu.
Berbasis BSD Berbasis Linux Digunakan sebagaisumber
[ -t 1 ]
ini spesifik sh / bash, tetapi di sisi kanan setelah#(comment)
tanda ada fungsi C yang melakukan hal yang sama.man 3 isatty
harus membantu dalam hal ini;) Contoh yang ditampilkan sebagai perintah shell untuk menyederhanakan penjelasan tentang poin utama. Mengenaitput
utilitas sumber OPEN itu untuk menanyakan antarmuka kemampuan terminal standar.Seperti yang dinyatakan orang lain, Anda dapat menggunakan karakter melarikan diri. Anda dapat menggunakan header saya untuk membuatnya lebih mudah:
Contoh menggunakan makro header bisa:
sumber
Saya menggunakan solusi berikut, ini cukup sederhana dan elegan, dapat dengan mudah ditempelkan ke sumber, dan bekerja di Linux / Bash:
sumber
Dari pemahaman saya, kode warna ANSI khas
terdiri dari (nama dan codec)
ATTRIBUT FORMAT
FORGROUND COLOR
WARNA LATAR BELAKANG
TEKS
ATTRIBUT FORMAT RESET
Dengan informasi ini, mudah untuk memberi warna pada string "Saya seorang pisang!" dengan warna forground "Kuning" dan warna latar belakang "Hijau" seperti ini
Atau dengan pustaka C ++ berwarna
Lebih banyak contoh dengan FORMAT ATTRIBUTE di sini
sumber
Ini adalah topik lama, tapi saya menulis kelas dengan subclass bersarang dan anggota statis untuk warna yang ditentukan oleh makro C sederhana.
Saya mendapatkan
color
fungsi dari posting ini Color Text In C Programming di dreamincode.net oleh pengguna no2pencil.Saya membuatnya dengan cara ini agar dapat menggunakan konstanta statis di std :: cout stream seperti ini:
Kelas dan kode sumber program pengujian dapat diunduh di sini .
cc::console
akan mengatur ulang ke konsol warna dan atribut default,cc::underline
akan menggarisbawahi teks, yang berfungsi pada dempul yang telah saya uji program pengujian.Warna:
Yang dapat digunakan dengan kedua
fore
danback
subclass statis daricc
kelas statis.EDIT 2017
Saya hanya menambahkan kode kelas di sini agar lebih praktis.
Makro kode warna:
dan fungsi warna utama yang menentukan warna atau atribut ke layar:
ccolor.h
ccolor.cpp
sumber
const char *cc::bold = CC_ATTR(1);
Anda dapat menggunakan urutan pelarian, jika terminal Anda mendukungnya. Sebagai contoh:
sumber
Versi header gon1332 yang diperluas:
Seperti yang Anda lihat, ia memiliki lebih banyak kemampuan seperti kemampuan untuk mengatur warna latar belakang sementara, tanpa batas waktu, dan fitur lainnya. Saya juga percaya ini sedikit lebih ramah pemula dan lebih mudah mengingat semua fungsi.
Cukup sertakan file header di proyek Anda dan Anda siap untuk bergoyang-goyang dengan output terminal berwarna.
sumber
coba tajuk di sini untuk cara cepat dan mudah mewarnai teks: Header Warna Aedi
Escape-Sequence-Color-Header
Warnai Output Anda di Unix menggunakan C ++ !!
Opsi Atribut Teks:
Pilihan Warna:
Format:
Format Umum, termasuk nilai yang Anda inginkan dalam $ variabel $
misalnya
Pemakaian:
Cukup gunakan untuk mengalirkan warna yang Anda inginkan sebelum menghasilkan teks dan gunakan lagi untuk mengatur warna ke normal setelah menghasilkan teks.
sumber
Anda dapat menggunakan kode warna ANSI.
gunakan fungsi-fungsi ini.
sumber
Cara terbaik adalah dengan menggunakan perpustakaan ncurses - meskipun ini mungkin palu untuk memecahkan masalah jika Anda hanya ingin menghasilkan string berwarna sederhana
sumber
pada OSX shell, ini berfungsi untuk saya (termasuk 2 spasi di depan "teks merah"):
sumber