Saltar al contenido

¿Cómo dar color a la salida de System.out.println?

Hola, hemos encontrado la respuesta a lo que necesitas, continúa leyendo y la hallarás un poco más abajo.

Solución:

Nota

Es posible que no pueda colorear los cmd prompt, pero debería funcionar en muchos terminales Unix (o similares a Unix).

Además, tenga en cuenta que algunos terminales simplemente no admitirán algunas (si las hay) secuencias de escape ANSI y, especialmente, colores de 24 bits.

Uso

Consulte la sección Maldiciones en la parte inferior para obtener la mejor solución. Para una solución personal o fácil (aunque no como solución multiplataforma), consulte la Secuencias de escape ANSI sección.


TL; DR

  • Java: System.out.println ((char) 27 + "[31m" + "ERROR MESSAGE IN RED");

  • python: print(chr(27) + "[31m" + "ERROR MESSAGE IN RED")

  • bash or zsh: printf 'x1b[31mERROR MESSAGE IN RED'
    • this may also work for Os X: printf 'e[31mERROR MESSAGE IN RED'
  • sh: printf 'CTRL+V,CTRL+[[31mERROR MESSAGE IN RED'
    • ie, press CTRL+V and then CTRL+[ in order to get a “raw” ESC character when escape interpretation is not available
    • If done correctly, you should see a ^[. Although it looks like two characters, it is really just one, the ESC character.
    • You can also press CTRL+V,CTRL+[ in vim in any of the programming or sripting langauges because that uses a literal ESC character
    • Also, you can replace Ctrl+[ with ESC … eg, you can use CTRL+V,ESC, but I find the former easier, since I am already pressing CTRL and since [ is less out of the way.

ANSI Escape Sequences

Background on Escape Sequences

While it is not the best way to do it, the easiest way to do this in a programming or scripting language is to use escape sequences. From that link:

An escape sequence is a series of characters used to change the state of computers and their attached peripheral devices. These are also known as control sequences, reflecting their use in device control.

Backgound on ANSI Escape Sequences

However, it gets even easier than that in video text terminals, as these terminals use ANSI escape sequences. From that link:

ANSI escape sequences are a standard for in-band signaling to control the cursor location, color, and other options on video text terminals. Certain sequences of bytes, most starting with Esc and ‘[‘, are embedded into the text, which the terminal looks for and interprets as commands, not as character codes.

How to Use ANSI Escape Sequences

Generally

  • Escape sequences begin with an escape character; for ANSI escape sequences, the sequence always begins with ESC (ASCII: 27 / hex: 0x1B).
  • For a list of what you can do, refer to the ANSI Escape Sequence List on Wikipedia

In Programming Languages

Some programming langauges (like Java) will not interpret e or x1b as the ESC character. However, we know that the ASCII character 27is the ESC character, so we can simply typecast 27 to a char and use that to begin the escape sequence.

Here are some ways to do it in common programming languages:

  • Java

    • System.out.println((char)27 + "[33mYELLOW");
  • Python 3

    • print(chr(27) + "[34mBLUE");
    • print("x1b[35mMAGENTA");
      • Note that x1b is interpretted correctly in python
  • Node JS

    • The following will NOT color output in JavaScript in the Web Console
    • console.log(String.fromCharCode(27) + "[36mCYAN");
    • console.log("x1b[30;47mBLACK_ON_WHITE");
      • Note that x1b also works in node

In Shell Prompt OR Scripts

If you are working with bash or zsh, it is quite easy to color the output (in most terminals). In Linux, Os X, and in some Window’s terminals, you can check to see if your terminal supports color by doing both of the following:

  • printf 'e[31mRED'
  • printf 'x1b[31mRED'

If you see color for both, then that’s great! If you see color for only one, then use that sequence. If you do not see color for either of them, then double check to make sure you typed everything correctly and that you are in bash or zsh; if you still do not see any color, then your terminal probably does not support ANSI escape sequences.

If I recall correctly, linux terminals tend to support both e and x1b escape sequences, while os x terminals only tend to support e, but I may be wrong. Nonetheless, if you see something like the following image, then you’re all set! (Note that I am using the shell, zsh, and it is coloring my prompt string; also, I am using urxvt as my terminal in linux.)

ANSI Escape Sequences Coloring Text Red

“How does this work?” you might ask. Bascially, printf is interpretting the sequence of characters that follows (everything inside of the single-quotes). When printf encounters e or x1b, it will convert these characters to the ESC character (ASCII: 27). That’s just what we want. Now, printf sends ESC31m, and since there is an ESC followed by a valid ANSI escape sequence, we should get colored output (so long as it is supported by the terminal).

You can also use echo -e 'e[32mGREEN' (for example), to color output. Note that the -e flag for echo“[enables] interpretación de los escapes de barra invertida “ y debe usarse si quieres echo para interpretar adecuadamente la secuencia de escape.


Más sobre las secuencias de escape ANSI

Las secuencias de escape ANSI pueden hacer más que solo salida de color, pero comencemos con eso y veamos exactamente cómo funciona el color; luego, veremos cómo manipular el cursor; finalmente, echaremos un vistazo y veremos cómo usar el color de 8 bits y también el color de 24 bits (aunque solo tiene un soporte tenue).

En Wikipedia, se refieren a ESC[ as CSI, so I will do the same.

Color

To color output using ANSI escapes, use the following:

  • CSInm
    • CSI: escape character—^[[ or ESC[
    • n: a number—one of the following:
      • 3037, 39: foreground
      • 4047, 49: background
    • m: a literal ASCII m—terminates the escape sequence

I will use bash or zsh to demonstrate all of the possible color combinations. Plop the following in bash or zsh to see for yourself (You may need to replace e with x1b):

  • for fg in 30..37 39; do for bg in 40..47 49; do printf "e[$fg;$bgm~TEST~"; done; printf "n"; done;

Result:

various foreground/background colors using ANSI escapes

Quick Reference (Color)

+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  fg  |  bg  |  color    |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  30  |  40  |  black    |
|  31  |  41  |  red      |
|  32  |  42  |  green    |
|  33  |  43  |  yellow   |
|  34  |  44  |  blue     |
|  35  |  45  |  magenta  |
|  36  |  46  |  cyan     |
|  37  |  47  |  white    |
|  39  |  49  |  default  |
+~~~~~~+~~~~~~+~~~~~~~~~~~+

Select Graphic Rendition (SGR)

SGR just allows you to change the text. Many of these do not work in certain terminals, so use these sparingly in production-level projects. However, they can be useful for making program output more readable or helping you distinguish between different types of output.

Color actually falls under SGR, so the syntax is the same:

  • CSInm
    • CSI: escape character—^[[ or ESC[
    • n: a number—one of the following:
      • 0: reset
      • 19: turns on various text effects
      • 2129: turns off various text effects (less supported than 19)
      • 3037, 39: foreground color
      • 4047, 49: background color
      • 38: 8- or 24-bit foreground color (see 8/24-bit Color below)
      • 48: 8- or 24-bit background color (see 8/24-bit Color below)
    • m: a literal ASCII m—terminates the escape sequence

Although there is only tenuous support for faint (2), italic (3), underline (4), blinking (5,6), reverse video (7), conceal (8), and crossed out (9), some (but rarely all) tend to work on linux and os x terminals.

It’s also worthwhile to note that you can separate any of the above attributes with a semi-colon. For example printf 'e[34;47;1;3mCRAZY TEXTn' will show CRAZY TEXT with a blue foreground on a white background, and it will be bold and italic.

Eg:

string attributes together example screenshot

Plop the following in your bash or zsh shell to see all of the text effects you can do. (You may need to replace e with x1b.)

  • for i in 1..9; do printf "e[$im~TEST~e[0m "; done

Result:

SGR state 1SGR state 2

You can see that my terminal supports all of the text effects except for faint (2), conceal (8) and cross out (9).

Quick Reference (SGR Attributes 0-9)

+~~~~~+~~~~~~~~~~~~~~~~~~+
|  n  |  effect          |
+~~~~~+~~~~~~~~~~~~~~~~~~+
|  0  |  reset           |
|  1  |  bold            |
|  2  |  faint*          |
|  3  |  italic**        |
|  4  |  underline       |
|  5  |  slow blink      |
|  6  |  rapid blink*    |
|  7  |  inverse         |
|  8  |  conceal*        |
|  9  |  strikethrough*  |
+~~~~~+~~~~~~~~~~~~~~~~~~+

* not widely supported
** not widely supported and sometimes treated as inverse

8-bit Color

While most terminals support this, it is less supported than 0-7,9 colors.

Syntax:

  • CSI38;5;nm
    • CSI: escape character—^[[ or ESC[
    • 38;5;: literal string that denotes use of 8-bit colors for foreground
    • n: a number—one of the following:
      • 0255

If you want to preview all of the colors in your terminal in a nice way, I have a nice script on gist.github.com.

It looks like this:

8-bit color example screenshot

If you want to change the background using 8-bit colors, just replace the 38 with a 48:

  • CSI48;5;nm
    • CSI: escape character—^[[ or ESC[
    • 48;5;: literal string that denotes use of 8-bit colors for background
    • n: a number—one of the following:
      • 0255

24-bit Color

Also known as true color, 24-bit color provides some really cool functionality. Support for this is definitely growing (as far as I know it works in most modern terminals except urxvt, my terminal [insert angry emoji]).

El color de 24 bits es realmente compatible con vim (consulte la wiki de vim para ver cómo habilitar los colores de 24 bits). Es realmente genial porque se basa en el esquema de colores definido para gvim; por ejemplo, usa el fg / bg de highlight guibg=#______ guifg=#______ para los colores de 24 bits! Neato, ¿eh?

Así es como funciona el color de 24 bits:

  • CSI38;2;r;g;bm
    • CSI: Personaje de escape-^[[ o ESC[[
    • 38;2;: cadena literal que denota el uso de colores de 24 bits para el primer plano
    • r,g,b: números: cada uno debe ser 0255

Probar sólo algunos de los muchos colores que puedes tener(2^8)^3 o 2^24 o 16777216 posibilidades, creo), puede usar esto en bash o zsh:

  • for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "e[38;2;$r;$g;$bm($r,$g,$b)e[0m "; done; printf "n"; done; done;

Resultado (esto está en gnomo-terminal ya que urxvt NO SOPORTA color de 24 bits … júntelo, mantenedor de urxvt … de verdad):

Captura de pantalla de ejemplo en color de 24 bits

Si quieres colores de 24 bits para el fondo … ¡lo has adivinado! Tu solo reemplazas 38 con 48:

  • CSI48;2;r;g;bm
    • CSI: Personaje de escape-^[[ o ESC[[
    • 48;2;: cadena literal que denota el uso de colores de 24 bits para el fondo
    • r,g,b: números: cada uno debe ser 0255

Insertar secuencias de escape sin procesar

Algunas veces e y x1b no trabajará. Por ejemplo, en el sh shell, a veces ninguno funciona (aunque lo hace en mi sistema ahora, No creo que solía hacerlo).

Para evitar esto, puede usar CONTROL+V,CONTROL+[[ o CONTROLV,ESC

Esto insertará un “crudo” ESC carácter (ASCII: 27). Se verá así ^[, pero no te preocupes; es sólo un carácter, no dos.

P.ej:

sh raw escape char ejemplo captura de pantalla


Maldiciones

Consulte la página Curses (Biblioteca de programación) para obtener una referencia completa sobre las maldiciones. Cabe señalar que curses solo funciona en sistemas operativos Unix y similares a Unix.

En marcha con maldiciones

No entraré en demasiados detalles, ya que los motores de búsqueda pueden revelar enlaces a sitios web que pueden explicar esto mucho mejor que yo, pero lo discutiré brevemente aquí y daré un ejemplo.

¿Por qué utilizar maldiciones sobre escapes ANSI?

Si lees el texto anterior, es posible que recuerdes que e o x1b a veces trabajará con printf. Bueno, a veces e y x1b no funcionará en absoluto (esto no es estándar y nunca he trabajado con un terminal como este, pero es posible). Más importante aún, secuencias de escape más complejas (piense Hogar y otras claves de varios caracteres) son difíciles de admitir para cada terminal (a menos que esté dispuesto a dedicar mucho tiempo y esfuerzo a analizar terminfo y termcap y averiguar cómo manejar cada terminal).

Maldiciones resuelve este problema. Básicamente, puede comprender qué capacidades tiene un terminal, utilizando estos métodos (como se describe en el artículo de wikipedia vinculado anteriormente):

La mayoría de las implementaciones de curses utilizan una base de datos que puede describir las capacidades de miles de terminales diferentes. Hay algunas implementaciones, como PDCurses, que utilizan controladores de dispositivos especializados en lugar de una base de datos de terminal. La mayoría de las implementaciones usan terminfo; algunos usan termcap. Curses tiene la ventaja de la portabilidad hacia atrás a terminales de celda de carácter y la simplicidad. Para una aplicación que no requiere gráficos en mapa de bits o múltiples fuentes, una implementación de interfaz que usa curses generalmente será mucho más simple y rápida que una que usa un kit de herramientas X.

La mayoría de las veces, las maldiciones sondearán terminfo y luego podrán entender cómo manipular el cursor y los atributos del texto. Luego, usted, el programador, usa la API proporcionada por curses para manipular el cursor o cambiar el color del texto u otros atributos si desea la funcionalidad que busca.

Ejemplo con Python

Creo que Python es realmente fácil de usar, pero si desea usar curses en un lenguaje de programación diferente, simplemente búsquelo en duckduckgo o en cualquier otro motor de búsqueda. 🙂 Aquí hay un ejemplo rápido en Python 3:

import curses

def main(stdscr):
    # allow curses to use default foreground/background (39/49)
    curses.use_default_colors()

    # Clear screen
    stdscr.clear()

    curses.init_pair(1, curses.COLOR_RED, -1)
    curses.init_pair(2, curses.COLOR_GREEN, -1)
    stdscr.addstr("ERROR: I like tacos, but I don't have any.n", curses.color_pair(1))
    stdscr.addstr("SUCCESS: I found some tacos.n", curses.color_pair(2))

    stdscr.refresh() # make sure screen is refreshed
    stdscr.getkey()  # wait for user to press key

if __name__ == '__main__':
    curses.wrapper(main)

resultado:

ingrese la descripción de la imagen aquí

Podrías pensar que esta es una forma mucho más redonda de hacer las cosas, pero en realidad es mucho más multiplataforma (realmente cross-terminal … al menos en el mundo de las plataformas Unix y Unix). Para los colores, no es bastante tan importante, pero cuando se trata de admitir otras secuencias de escape de múltiples secuencias (como Hogar, Fin, Página arriba, Página abajo, etc.), entonces las maldiciones se vuelven aún más importantes.

Ejemplo con Tput

  • tput es una utilidad de línea de comando para manipular el cursor y el texto
  • tput viene con el curses paquete. Si desea usar aplicaciones de terminal cruzado (ish) en el terminal, debe usar tput, ya que analiza terminfo o lo que sea necesario y usa un conjunto de comandos estandarizados (como curses) y devuelve la secuencia de escape correcta.
  • ejemplo:
echo "$(tput setaf 1)$(tput bold)ERROR:$(tput sgr0)$(tput setaf 1) My tacos have gone missing"
echo "$(tput setaf 2)$(tput bold)SUCCESS:$(tput sgr0)$(tput setaf 2) Oh good! I found my tacos!"

Resultado:

ejemplo con tput

Más información sobre Tput

  • ver: http://linuxcommand.org/lc3_adv_tput.php para ver cómo funciona tput
  • consulte: http://invisible-island.net/ncurses/man/terminfo.5.html para obtener una lista de comandos que puede utilizar

Esto me ha funcionado:

System.out.println((char)27 + "[31mThis text would show up red" + (char)27 + "[0m");

Necesita la terminación “[37m”paradevolverelcolorablanco(oloqueseaqueestéusando)Sinolohacepuedehacerquetodoloquesiguesea”rojo”[37m”toreturnthecolortowhite(orwhateveryouwereusing)Ifyoudon’titmaymakeeverythingthatfollows”red”

No, pero hay API de terceros que pueden manejarlo.

http://www.javaworld.com/javaworld/javaqa/2002-12/02-qa-1220-console.html

Editar: por supuesto que hay artículos más nuevos que el que publiqué, aunque la información sigue siendo viable.

Comentarios y calificaciones

Si piensas que te ha resultado provechoso este artículo, nos gustaría que lo compartas con otros desarrolladores de este modo contrubuyes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *