Die Verwendung von ANSI-Codes ist eine gängige Methode, um Konsolenausgaben farblich zu gestalten und somit die Lesbarkeit und Benutzererfahrung zu verbessern. ANSI-Codes sind spezielle Escape-Sequenzen, die von vielen Terminals unterstützt werden, um Textattribute wie Farbe, Hintergrund und Textstil zu ändern. Dieser Artikel beschreibt die Nutzung von ANSI-Codes zur Farbgestaltung von Konsolenausgaben unter MacOS/Linux und Windows und zeigt entsprechende Java-Code-Beispiele.

Grundlagen der ANSI-Codes

ANSI-Codes sind in der Regel in der Form \033[<Code>m aufgebaut, wobei \033 das Escape-Zeichen ist und <Code> eine Zahlenkombination, die das gewünschte Attribut bestimmt. Hier sind einige der häufigsten ANSI-Codes:

  • Textfarbe Vordergrund:
  • Schwarz: \033[30m
  • Rot: \033[31m
  • Grün: \033[32m
  • Gelb: \033[33m
  • Blau: \033[34m
  • Magenta: \033[35m
  • Cyan: \033[36m
  • Weiß: \033[37m
  • Textfarbe Hintergrund:
  • Schwarz: \033[40m
  • Rot: \033[41m
  • Grün: \033[42m
  • Gelb: \033[43m
  • Blau: \033[44m
  • Magenta: \033[45m
  • Cyan: \033[46m
  • Weiß: \033[47m
  • Textstil:
  • Normal: \033[0m
  • Fett: \033[1m
  • Unterstrichen: \033[4m
  • Blinkend: \033[5m
  • Umgekehrt: \033[7m

Diese Codes können kombiniert werden, indem sie mit einem Semikolon getrennt werden. Zum Beispiel erzeugt \033[1;31m fettgedruckten roten Text.

Verwendung von ANSI-Codes in Java

Um ANSI-Codes in Java zu verwenden, müssen sie in Strings eingebettet werden, die an die Konsole ausgegeben werden. Hier sind einige Beispiele, wie dies in Java umgesetzt werden kann.

public class ANSIExample {

    // ANSI escape codes
    public static final String RESET = "\033[0m";
    public static final String RED = "\033[31m";
    public static final String GREEN = "\033[32m";
    public static final String YELLOW = "\033[33m";
    public static final String BLUE = "\033[34m";
    public static final String MAGENTA = "\033[35m";
    public static final String CYAN = "\033[36m";
    public static final String WHITE = "\033[37m";

    public static void main(String[] args) {
        System.out.println(RED + "Dieser Text ist rot" + RESET);
        System.out.println(GREEN + "Dieser Text ist grün" + RESET);
        System.out.println(YELLOW + "Dieser Text ist gelb" + RESET);
        System.out.println(BLUE + "Dieser Text ist blau" + RESET);
        System.out.println(MAGENTA + "Dieser Text ist magenta" + RESET);
        System.out.println(CYAN + "Dieser Text ist cyan" + RESET);
        System.out.println(WHITE + "Dieser Text ist weiß" + RESET);
    }
}Code-Sprache: PHP (php)

Plattformübergreifende Kompatibilität

MacOS/Linux

Die meisten Terminals unter MacOS und Linux unterstützen ANSI-Codes von Haus aus. Daher funktionieren die oben gezeigten Beispiele in der Regel ohne zusätzliche Konfiguration.

Windows

Unter Windows gibt es eine Besonderheit: Ältere Versionen der Eingabeaufforderung (cmd.exe) unterstützen ANSI-Codes nicht nativ. Dies kann jedoch durch den Einsatz modernerer Terminal-Emulatoren wie Windows Terminal oder durch Aktivieren der virtuellen Terminalverarbeitung in der Eingabeaufforderung gelöst werden.

Aktivieren der virtuellen Terminalverarbeitung in cmd.exe

Ab Windows 10 kann die virtuelle Terminalverarbeitung mit dem folgenden Befehl aktiviert werden:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinNT.HANDLE;

public class EnableVirtualTerminal {

    public interface Kernel32 extends Library {
        Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
        HANDLE GetStdHandle(int nStdHandle);
        boolean GetConsoleMode(HANDLE hConsoleHandle, DWORDByReference lpMode);
        boolean SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode);
    }

    public static void main(String[] args) {
        final int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004;
        HANDLE hOut = Kernel32.INSTANCE.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE);
        DWORDByReference mode = new DWORDByReference(new DWORD(0));
        if (Kernel32.INSTANCE.GetConsoleMode(hOut, mode)) {
            Kernel32.INSTANCE.SetConsoleMode(hOut, new DWORD(mode.getValue() | ENABLE_VIRTUAL_TERMINAL_PROCESSING));
        }

        System.out.println("\033[31mDieser Text ist rot\033[0m");
        System.out.println("\033[32mDieser Text ist grün\033[0m");
    }
}Code-Sprache: JavaScript (javascript)

Dieses Beispiel zeigt, wie man mithilfe von JNA (Java Native Access) die virtuelle Terminalverarbeitung in der Windows-Eingabeaufforderung aktiviert.

Nutzen und Einschränkungen

Die Verwendung von ANSI-Codes kann die Lesbarkeit und Struktur von Konsolenausgaben erheblich verbessern, insbesondere bei Programmen, die komplexe Ausgaben erzeugen oder Benutzereingaben erfordern. Es ist jedoch wichtig, die Plattformkompatibilität zu berücksichtigen und sicherzustellen, dass die verwendeten Terminals ANSI-Codes unterstützen.

Fazit

ANSI-Codes bieten eine einfache und effektive Möglichkeit, Konsolenausgaben in Java farbig zu gestalten. Während sie auf MacOS und Linux weitgehend problemlos eingesetzt werden können, erfordern sie unter Windows möglicherweise zusätzliche Konfigurationen oder den Einsatz moderner Terminal-Emulatoren. Mit den richtigen Techniken können Entwickler ansprechende und benutzerfreundliche Konsolenanwendungen erstellen, die plattformübergreifend funktionieren.