Kolory w terminalu: kody ANSI w Pythonie, JavaScript, Javie, PHP i C++
Konsola nie musi być szara. Czerwony komunikat o błędzie, zielone “OK”, żółte ostrzeżenie albo choinka z kolorowymi bombkami: to wszystko robią kody ANSI (ang. ANSI escape codes), czyli krótkie sekwencje znaków wstawiane do zwykłego napisu. Terminal ich nie wypisuje, tylko zmienia według nich kolor i styl tekstu.
Na tej stronie znajdziesz budowę sekwencji, tabelę kodów, paletę 256 kolorów i truecolor, przykłady w pięciu językach i najczęstsze błędy. Każdy przykład uruchomisz w przeglądarce, bez instalacji: konsola BitWizards pokazuje kolory ANSI w Pythonie, JavaScript, Javie, PHP i C++.
Wypróbuj pierwszy kolorowy napis w Pythonie
Jak działa kolorowy tekst w konsoli
Sekwencja zaczyna się od niewidocznego znaku ESC (kod 27, szesnastkowo 1B, ósemkowo 33). Po nim stoi nawias kwadratowy, liczby oddzielone średnikami i litera m, która oznacza “ustaw wygląd tekstu”:
ESC [ 31 m czerwony tekst
ESC [ 1 ; 32 m pogrubiony zielony tekst
ESC [ 0 m reset: powrót do domyślnego wyglądu Ustawiony wygląd trwa do resetu. Wszystko, co program wypisze po ESC[31m, będzie czerwone, także w kolejnych liniach, aż pojawi się ESC[0m. Dlatego kolorowy fragment zawsze zamyka się resetem.
Sam znak ESC w kodzie zapisuje się jako sekwencję ucieczki w napisie. Każdy język ma na to swój sposób:
| Język | Zapis ESC | Przykład: czerwony napis |
|---|---|---|
| Python | \033, \x1b, \u001b | print("\033[31mtekst\033[0m") |
| JavaScript | \x1b, \u001b | console.log("\x1b[31mtekst\x1b[0m") |
| Java | \u001B, \033 | System.out.println("\u001B[31mtekst\u001B[0m") |
| PHP | \e, \033 | echo "\e[31mtekst\e[0m"; |
| C++ | \x1b, \033 | cout << "\x1b[31mtekst\x1b[0m"; |
Tabela kodów ANSI: kolory tekstu i tła
Osiem podstawowych kolorów ma kody 30-37 dla tekstu i 40-47 dla tła. Jasne odmiany to 90-97 (tekst) i 100-107 (tło).
| Kolor | Tekst | Jasny tekst | Tło | Jasne tło |
|---|---|---|---|---|
| czarny | 30 | 90 | 40 | 100 |
| czerwony | 31 | 91 | 41 | 101 |
| zielony | 32 | 92 | 42 | 102 |
| żółty | 33 | 93 | 43 | 103 |
| niebieski | 34 | 94 | 44 | 104 |
| purpurowy (magenta) | 35 | 95 | 45 | 105 |
| błękitny (cyan) | 36 | 96 | 46 | 106 |
| biały | 37 | 97 | 47 | 107 |
Dokładny odcień zależy od terminala: każdy ma własną paletę, a “jasny czarny” (90) zwykle wygląda jak szary.
Style tekstu: pogrubienie, podkreślenie, odwrócenie
| Kod | Działanie |
|---|---|
| 0 | reset: domyślny kolor i styl |
| 1 | pogrubienie |
| 2 | przyciemnienie |
| 3 | kursywa |
| 4 | podkreślenie |
| 7 | odwrócenie: kolor tekstu i tła zamieniają się miejscami |
Kody łączy się średnikiem w jednej sekwencji. ESC[1;4;33;44m daje pogrubiony, podkreślony żółty tekst na niebieskim tle.
256 kolorów i truecolor
Gdy osiem kolorów to za mało, są dwie rozszerzone formy:
- paleta 256 kolorów:
ESC[38;5;nmustawia kolor tekstu,ESC[48;5;nmkolor tła, gdzie n to liczba 0-255. Numery 0-15 to kolory podstawowe i jasne, 16-231 to sześcian 6x6x6 (numer = 16 + 36 * r + 6 * g + b, gdzie r, g, b to 0-5), a 232-255 to odcienie szarości; - truecolor (24 bity):
ESC[38;2;r;g;bmustawia tekst na dowolny kolor RGB, aESC[48;2;r;g;bmtło. Na przykładESC[38;2;255;128;0mto pomarańczowy.
Ten program w Pythonie rysuje sześcian palety 256 kolorów jako kolorowe tło:
for number in range(16, 232):
print(f"\033[48;5;{number}m \033[0m", end="")
if (number - 15) % 36 == 0:
print() Kolorowy tekst w Pythonie (print z kolorem)
W Pythonie nie potrzeba żadnej biblioteki. Wygodnie jest trzymać kody w stałych i doklejać je do napisu albo wstawiać w f-stringu:
RED = "\033[31m"
GREEN = "\033[32m"
BOLD = "\033[1m"
RESET = "\033[0m"
print(RED + "Błąd: brak pliku" + RESET)
print(f"{BOLD}{GREEN}Zapisano!{RESET} Dalej zwykły tekst.") Przy większej liczbie komunikatów przydaje się mała funkcja, która sama dokleja reset:
def colored(text, code):
return f"\033[{code}m{text}\033[0m"
print(colored("PASS", "1;32"), "test_login")
print(colored("FAIL", "1;31"), "test_logout") Popularne biblioteki (np. colorama, rich) robią to samo pod spodem: wypisują sekwencje ANSI. Kurs z lekcjami o kolorach: Python w przeglądarce.
Kolory w konsoli JavaScript (console.log)
W Node.js i w konsoli BitWizards console.log wypisuje sekwencje ANSI tak samo jak inne języki. ESC zapisuje się jako \x1b albo \u001b. Zapis ósemkowy \033 w JavaScript jest przestarzały i w trybie ścisłym ("use strict", moduły) kończy się błędem składni.
const RED = "\x1b[31m";
const RESET = "\x1b[0m";
console.log(RED + "Błąd: brak pliku" + RESET);
console.log(`\x1b[1;32mZapisano!${RESET} Dalej zwykły tekst.`); Więcej o kursie: JavaScript.
Kolory w konsoli Java (System.out.println)
W Javie ESC to najczęściej \u001B, działa też ósemkowe \033:
public class Main {
static final String RED = "\u001B[31m";
static final String RESET = "\u001B[0m";
public static void main(String[] args) {
System.out.println(RED + "Błąd: brak pliku" + RESET);
System.out.println("\u001B[1;32mZapisano!" + RESET + " Dalej zwykły tekst.");
}
} Więcej o kursie: Java.
Kolory w konsoli PHP (echo)
PHP ma skrót \e dla znaku ESC, działa też \033. Uwaga: sekwencje ucieczki działają tylko w napisach w cudzysłowach "...". W apostrofach '\e[31m' PHP wypisze dosłownie ukośnik i literę e.
<?php
$red = "\e[31m";
$reset = "\e[0m";
echo $red . "Błąd: brak pliku" . $reset . "\n";
echo "\e[1;32mZapisano!\e[0m Dalej zwykły tekst.\n"; Kody ANSI dotyczą konsoli (PHP uruchamiany z wiersza poleceń). Na stronie WWW kolor ustawia się w HTML i CSS. Więcej o kursie: PHP.
Kolory w konsoli C++ (cout)
W C++ ESC zapisuje się szesnastkowo \x1b albo ósemkowo \033:
#include <iostream>
using namespace std;
int main() {
cout << "\x1b[31m" << "Blad: brak pliku" << "\x1b[0m" << endl;
cout << "\033[1;32mZapisano!\033[0m Dalej zwykly tekst." << endl;
return 0;
} Więcej o kursie: C++.
Częste błędy
- Brak resetu, kolor “wycieka”. Bez
ESC[0mna końcu kolor przechodzi na następne linie programu, a w prawdziwym terminalu czasem nawet na znak zachęty po zakończeniu programu. Każdy kolorowy fragment zamykaj resetem. - Starsza konsola Windows. Klasyczna konsola
cmd.exepokazuje sekwencje jako znaki typu←[31m, dopóki program nie włączy przetwarzania sekwencji VT (tak robi na przykładcolorama.just_fix_windows_console()w Pythonie). Windows Terminal, terminale Linuksa i macOS obsługują ANSI od razu. - Konsole w IDE. Jedne pokazują kolory (np. terminal w VS Code, konsola PyCharm), inne surowe znaki (np. IDLE). Gdy kolory nie działają, uruchom program w terminalu systemowym.
- Wyjście do pliku. Po przekierowaniu wyniku do pliku (
python app.py > log.txt) sekwencje trafiają do pliku jako zwykłe znaki. Programy narzędziowe często wyłączają kolory, gdy wyjście nie jest terminalem, albo gdy ustawiona jest zmienna środowiskowaNO_COLOR. - Apostrofy w PHP,
\033w JavaScript. Patrz sekcje wyżej: w PHP potrzebne są cudzysłowy, a w JavaScript lepiej używać\x1b. - Znaki sterujące poza kolorami. Czyszczenie ekranu (
ESC[2J) czy ruch kursora działają w prawdziwym terminalu, ale konsola BitWizards je pomija i pokazuje tylko kolory i style.
Projekt: choinka z kolorowymi bombkami
Dobry pierwszy projekt z kolorami łączy pętle, losowanie i kody ANSI. Choinka jest zielona, a w losowych miejscach wiszą bombki w jasnych kolorach. Pień ma brązowy kolor z palety 256 kolorów. Każde uruchomienie daje inną choinkę:
import random
GREEN = "\033[32m"
TRUNK = "\033[38;5;94m"
RESET = "\033[0m"
BAUBLES = ["\033[91m", "\033[93m", "\033[94m", "\033[95m", "\033[96m"]
height = 7
for row in range(height):
line = ""
for _ in range(2 * row + 1):
if random.random() < 0.2:
line += random.choice(BAUBLES) + "o" + RESET
else:
line += GREEN + "*" + RESET
print(" " * (height - row - 1) + line)
print(" " * (height - 2) + TRUNK + "###" + RESET) Pomysł opisuje szerzej artykuł autora Tworzenie choinki w Pythonie: świąteczne programowanie. Kolorową choinkę jako przykład i zadanie znajdziesz w temacie “Kolory w konsoli” każdego kursu podstaw (lista lekcji niżej).
Kolory w konsoli BitWizards
Konsola BitWizards interpretuje kody ANSI we wszystkich językach działających w przeglądarce: Pythonie, JavaScript, Javie, PHP i C++. Obsługiwane są:
- reset (0), pogrubienie (1), przyciemnienie (2), kursywa (3), podkreślenie (4) i odwrócenie (7);
- kolory tekstu 30-37 i jasne 90-97, tła 40-47 i jasne 100-107;
- paleta 256 kolorów (
38;5;n,48;5;n) i truecolor (38;2;r;g;b).
Kolor trwa do resetu i przechodzi na kolejne linie, jak w terminalu. Paleta jest dobrana do jasnego i ciemnego motywu, więc napisy pozostają czytelne w obu. Pozostałe sekwencje (czyszczenie ekranu, ruch kursora) są pomijane. Kod uruchamia się w przeglądarce, bez instalowania kompilatora czy interpretera.
Lekcje: temat “Kolory w konsoli”
Na końcu kursów podstaw jest temat “Kolory w konsoli” z czterema przykładami (pierwszy kolorowy napis, osiem kolorów i jasne odmiany, pogrubienie, podkreślenie i tło, choinka z kolorowymi bombkami) oraz zadaniami: zielony napis OK, sygnalizator świetlny, tęcza z pętli, pasek postępu, raport testów PASS i FAIL oraz kolorowa choinka. Lekcje otworzysz bez logowania:
- Python: kolory w konsoli
- JavaScript: kolory w konsoli
- Java: kolory w konsoli
- PHP: kolory w konsoli
- C++: kolory w konsoli
Powiązane technologie
Python - JavaScript - Java - PHP - C++