Colores y formato del texto de terminal de aplicaciones Java: Códigos de escape ANSI

Buenas foro,
El otro día mientras navegaba por internet, me encontré con una especie una blog que hablaba de una característica de java, creo que es algo generalizado que compartan otros lenguajes y sistemas, ya que al parecer son códigos de escape ANSI, pero en Java funciona de la siguiente manera:


USO DE LOS CODIGOS DE ESCAPE ANSI (AL MENOS EN JAVA) :

Antes del texto que queremos imprimir, se debe imprimir uno o mas de estos códigos, que determinaran el formato del texto a imprimir, se complementaran o se suplantaran respectivamente, luego, imprimiremos el texto deseado, y finalmente resetearemos el formato, para que no influya en el siguiente texto. El texto se imprimirá con el formato deseado.


EJEMPLO EN JAVA:

Por ejemplo, si queremos imprimir un texto en color verde:

System.out.print("\u001B[32m" + "HOLA MUNDO, EN VERDE" + "\u001B[0m");

Donde ele elemento "\u001B[32m" hace referencia al color, y "\u001B[0m" es el código de reset.

El resultado debería de ser algo así:

O, si queremos complicar mas la cosa, podemos añadir mas elementos a la vez, como por ejemplo, fondo blanco, letra negra, y subrayado:

System.out.print("\u001B[107m" + "\u001B[30m" + "\u001B[4m" + "HOLA MUNDO, EN FONDO BLANCO, COLOR NEGRO, Y SUBRAYADO" + "\u001B[0m");

Donde los elementos están ordenados según los he ido mencionando.

El resultado debería de ser algo así:


CLASE “ColorT”:

Los mas observadores se habrán dado cuenta de que el código es exactamente igual en todos los casos, excepto por un numero que va cambiando. Según ese numero, el formato del texto cambiara.

La secuencia \u001B[ hace referencia a ESC, de código de escape ANSI, el numero, hace referencia a el formato / color que le vayamos a dar al texto (cada uno se identifica con un numero), y la letra m, hace referencia a que característica de los escapes ANSI estamos usando (en este caso, a que vamos a dar formato / color a un texto).

Por lo que, y para hacerlo mas sencillo, he creado una pequeña clase con atributos estáticos como contenedor para estos códigos, y aquí os la dejo:
(No se si son todos, seguro que me estoy dejando algunos, pero estos son los mas útiles que he encontrado)

/* Creador: Sugoli15.
 * Subido a foro.linuxchad.org el dia 08/01/2025.
 */

public class ColorT {

	// Si no se coloca al final de una impresión, los estilos afectarán a la siguiente línea.
	final static String reset = "\u001B[0m";
	
	// Color de letras y decoraciones.
	final static String colorWhite = "\u001B[29m";
	final static String colorBlack = "\u001B[30m";
	final static String colorRed = "\u001B[31m";
	final static String colorGreen = "\u001B[32m";
	final static String colorGold = "\u001B[33m";
	final static String colorDarkBlue = "\u001B[34m";
	final static String colorPurple = "\u001B[35m";
	final static String colorSkyBlue = "\u001B[36m";
	final static String colorGry1 = "\u001B[37m";
	final static String colorGry2 = "\u001B[90m";
	final static String colorPastelRed = "\u001B[91m";
	final static String colorPastelGreen = "\u001B[92m";
	final static String colorPastelYellow = "\u001B[93m";
	final static String colorPastelDarkBlue = "\u001B[94m";
	final static String colorPastelPurple = "\u001B[95m";
	final static String colorPastelSkyBlue = "\u001B[96m";
	
	// Color de fondo.
	final static String backgroundBlack = "\u001B[40m";
	final static String backgroundRed = "\u001B[41m";
	final static String backgroundGreen = "\u001B[42m";
	final static String backgroundGold = "\u001B[43m";
	final static String backgroundDarkBlue = "\u001B[44m";
	final static String backgroundPurple = "\u001B[45m";
	final static String backgroundSkyBlue = "\u001B[46m";
	final static String backgroundGry1 = "\u001B[47m";
	final static String backgroundGry2 = "\u001B[100m";
	final static String backgroundPastelRed = "\u001B[101m";
	final static String backgroundPastelGreen = "\u001B[102m";
	final static String backgroundPastelYellow = "\u001B[103m";
	final static String backgroundPastelDarkBlue = "\u001B[104m";
	final static String backgroundPastelPurple = "\u001B[105m";
	final static String backgroundPastelSkyBlue = "\u001B[106m";
	final static String backgroundWhite = "\u001B[107m";
	
	// Decoraciones.
	final static String bold = "\u001B[1m";
	final static String italics = "\u001B[3m";
	final static String underlined = "\u001B[4m";
	final static String crossed = "\u001B[9m";
	final static String underlinedDouble = "\u001B[21m";
	final static String border = "\u001B[51m";
}

Y aquí un ejemplo de como se usaría en otra clase:

public class test {

	public static void main(String[] args) {
		
		System.out.print("\n  ");

		System.out.println(ColorT.border + ColorT.colorRed + ColorT.backgroundGry1+ " Hola Mundo! " + ColorT.reset);
		
		System.out.println("  " + ColorT.crossed + ColorT.colorGold + " Adios  Mundo! " + ColorT.reset);
		
	}

}

El resultado debería de ser algo así:


EN RESUMEN:

Los códigos de escape ANSI ofrecen muchas opciones para controlar el output en una terminal, yo solo he hablado de colores y decoraciones de texto, pero puedes hacer mucho mas, desde limpiar la pantalla, hasta mover el cursor.

Quiero comentar que por ahí he visto que con Windows hay problemas de compatibilidad (en algunas aplicaciones antiguas, no se si el CMD entra en esa categoría), pero bueno, nada de lo que nosotros debamos preocuparnos ; ) .

También soy consciente de que el nombre de la clase ColorT es una mierda, lo siento, no se me ha ocurrido algo mejor, “Color”, pues de color, y “T”, pues de terminal, en fin, acepto sugerencias.

Cualquier cosa que sepáis que no haya dicho, por favor, aportarlo, me parece un tema muy interesante.

En fin, gracias por leer, se que no le interesara a mucha gente, pero aprendiendo cosas nuevas es como uno se hace sabio.
Un saludo : ) .

1 me gusta