source

System.out.println 출력 컬러링 방법

factcode 2022. 10. 13. 23:36
반응형

System.out.println 출력 컬러링 방법

Java 출력은 어떻게 색칠합니까?

C 등의 를 사용할 수 .\033[0m이 일을 하기 위해서.이치노

public static void main(String[] x) {
    System.out.println("\033[0m BLABLA \033[0m\n");
}

메모

의 색을 수 .cmd prompt합니다.

또한 일부 단말기는 일부(있는 경우) ANSI 이스케이프 시퀀스, 특히 24비트 색상을 지원하지 않습니다.

사용.

가장 좋은 해결책은 하단에 있는 "저주" 섹션을 참조하십시오.퍼스널 솔루션 또는 간단한 솔루션(크로스 플랫폼솔루션은 아니지만)에 대해서는, 「ANSI 이스케이프 시퀀스」섹션을 참조해 주세요.


TL;DR

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

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

  • bash 또는 zsh:printf '\x1b[31mERROR MESSAGE IN RED'
    • X: " X"에도 유효합니다.printf '\e[31mERROR MESSAGE IN RED'
  • sh:printf 'CTRL+V,CTRL+[[31mERROR MESSAGE IN RED'
    • 즉, 에스케이프 해석을 사용할 수 없는 경우 CTRL+V를 누른 다음 CTRL+[를 눌러 "raw" 문자를 가져옵니다.
    • 하면, 「」가 됩니다.^[두 글자처럼 보이지만 실제로는 한 글자일 뿐이다.
    • 또한 프로그래밍 또는 스크립팅 언어에서 vim에서 +,+VCTRL[를 누를 수 있습니다.그것은 문자 그대로의 문자를 사용하기 때문입니다.
    • 또한 +를 […로 대체할 수 있지만, +…VESC를 사용할 수 있습니다만, 이미 누르고 있기 때문에, 방해가 되지 않기 때문에, 전자가 더 편합니다.

ANSI 이스케이프 시퀀스

이스케이프 시퀀스 배경

최적의 방법은 아니지만 프로그래밍 또는 스크립팅 언어로 이를 수행하는 가장 쉬운 방법은 이스케이프 시퀀스를 사용하는 것입니다.이 링크에서:

이스케이프 시퀀스는 컴퓨터와 연결된 주변 장치의 상태를 변경하기 위해 사용되는 일련의 문자입니다.디바이스 제어에서의 사용을 반영하여 제어 시퀀스라고도 합니다.

ANSI 이스케이프 시퀀스 백가운드

그러나 비디오 텍스트 단말기는 ANSI 이스케이프 시퀀스를 사용하기 때문에 비디오 텍스트 단말기에 비해 훨씬 쉬워집니다.이 링크에서:

ANSI 이스케이프 시퀀스는 비디오텍스트 단말기의 커서 위치, 색상 및 기타 옵션을 제어하는 인밴드시그널링의 표준입니다Esc 및 '['로 시작하는 특정 바이트 시퀀스는 텍스트에 포함되어 있으며, 이 텍스트는 문자 코드가 아닌 명령어로 검색 및 해석됩니다.

ANSI 이스케이프 시퀀스 사용방법

일반적으로.

  • 이스케이프 시퀀스는 이스케이프 문자로 시작합니다.ANSI 이스케이프 시퀀스의 경우 시퀀스는 항상 (ASCII:27 / 16진수:0x1B를 참조해 주세요.
  • 실행할 수 있는 기능의 리스트에 대해서는, Wikipedia 의 「ANSI 이스케이프 시퀀스 리스트」를 참조해 주세요.

프로그래밍 언어

Java는 "Java"를 해석하지 .\e ★★★★★★★★★★★★★★★★★」\x1b캐릭터로서.단, ASCII 문자는27 캐릭터이기 때문에 간단하게 타이프 캐스팅을 할 수 있습니다.27 a까지char그걸 이용해서 탈출 순서를 시작할 수 있어요

일반적인 프로그래밍 언어로 이를 수행하는 몇 가지 방법은 다음과 같습니다.

  • 자바

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

    • print(chr(27) + "[34mBLUE");
    • print("\x1b[35mMAGENTA");
      • :\x1bpythonpython으로됩니다.
  • 노드 JS

    • 웹 콘솔의 JavaScript 출력은 색칠하지 않습니다.
    • console.log(String.fromCharCode(27) + "[36mCYAN");
    • console.log("\x1b[30;47mBLACK_ON_WHITE");
      • :\x1b합니다.

셸 프롬프트 OR 스크립트

bash 또는 zsh사용하는 경우 출력에 색을 입히는 것이 매우 쉽습니다(대부분의 터미널).Linux, OS X 및 일부 Window 터미널에서는 다음 두 가지 작업을 모두 수행하여 단말기가 색상을 지원하는지 확인할 수 있습니다.

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

만약 둘 다 색깔을 본다면, 그것은 매우 좋습니다!한 가지 색상만 표시되는 경우 해당 시퀀스를 사용하십시오.어느 쪽에도 색상이 표시되지 않는 경우는, 모든 것을 올바르게 입력해, bash 또는 zsh 에 있는 것을 재차 확인해 주세요.색상이 아직 표시되지 않는 경우는, 단말기에서 ANSI 이스케이프 시퀀스가 서포트되고 있지 않을 가능성이 있습니다.

맞다면 는 Linux를 모두 .\e ★★★★★★★★★★★★★★★★★」\x1bx는 os x의 seascape sequence 。\e하지만 내가 틀릴 수도 있어그래도 다음 이미지 같은 것이 보이면, 이것으로 끝입니다! (shell, zsh를 사용하고 있으며, 프롬프트 스트링을 색칠하고 있습니다.또한 Linux에서는 urxvt를 단말기로 사용하고 있습니다.)

ANSI 이스케이프 시퀀스컬러링 텍스트레드

"이거 어떻게 하는 거야?"라고 물을 수 있습니다.기본적으로는printf는 뒤에 이어지는 문자의 시퀀스를 해석하고 있습니다(싱글 문자 내의 모든 것).언제printf「」가\e ★★★★★★★★★★★★★★★★★」\x1b는, 이러한 문자를 문자(ASCII:27)로 변환합니다.그게 바로 우리가 원하는 거야지금이다,printf송신하다31m에 이어 유효한 ANSI 이스케이프 시퀀스가 있기 때문에 (단말기에서 지원되는 한) 컬러 출력을 얻을 수 있습니다.

이 경우에도 하실 수 있습니다.echo -e '\e[32mGREEN'('나름', '나름', '나 '나름'이나 '나름'이나 '나름'이나)에 주의:-e을 들다echo ""백슬래시 이스케이프 해석"" 및 원하는 경우 사용해야 합니다.echo탈출 시퀀스를 적절히 해석할 수 있습니다.


ANSI 이스케이프 시퀀스에 대한 상세

ANSI 이스케이프 시퀀스는 단순히 컬러 출력만 할 수 있는 것이 아닙니다만, 우선, 색상의 동작을 정확하게 확인합니다.그러면 커서를 조작하는 방법에 대해 알아보겠습니다.마지막으로 8비트 컬러와 24비트 컬러의 사용법을 알아보겠습니다(단, 서포트하는 것은 약한 색뿐입니다.

위키피디아에서는 다음과 같이 언급합니다.CSI그래서 저도 똑같이 하겠습니다.

색.

ANSI 이스케이프를 사용하여 출력을 색칠하려면 다음 명령을 사용합니다.

  • CSI n m
    • CSI 문자: : " " " : "^[[또는
    • n: 호:: 음음음음 : : :.
      • 30-37,39 : " " "
      • 40-47,49 : ★★★
    • m ASCII : ASCIIm 시퀀스를 합니다.「 」 。

또는 .bash 는 zsh 。직접 하십시오('bash'를 'zsh'로 치환해야 할 수).\e\x1b

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

결과:

ANSI 이스케이프를 사용한 다양한 전경/배경색

퀵 레퍼런스 (컬러)

+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  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  |
+~~~~~~+~~~~~~+~~~~~~~~~~~+

그래픽 렌더링(SGR) 선택

SGR을 사용하면 텍스트를 변경할 수 있습니다.이들 중 대부분은 특정 터미널에서 작동하지 않으므로 프로덕션 수준 프로젝트에서 이러한 기능을 거의 사용하지 마십시오.그러나 프로그램 출력을 보다 쉽게 읽을 수 있도록 하거나 다른 유형의 출력을 구별하는 데 유용합니다.

색상은 실제로 SGR에 속하기 때문에 구문은 동일합니다.

  • CSI n m
    • CSI 문자: : " " " : "^[[또는
    • n: 호:: 음음음음 : : :.
      • 0 : 리셋
      • 1-9 효과를
      • 21-29: 다양한 텍스트 효과를 끕니다(지원 대상 수:1-9)
      • 30-37,39 : ★★★★
      • 40-47,49 : ★★★★★
      • 38: 8비트 또는 24비트 전경색 (아래 8/24비트 색상 참조)
      • 48: 8비트 또는 24비트 배경색 (아래 8/24비트 색상 참조)
    • m ASCII : ASCIIm 시퀀스를 합니다.「 」 。

희미(2), 기울임꼴(3), 밑줄(4), 깜박임(5,6), 반전 비디오(7), 숨김(8) 및 소거(9)를 서포트하고 있습니다만, Linux 및 os x 터미널에서 동작하는 것은 거의 없습니다.

또한 위의 속성 중 하나를 세미콜론으로 구분할 수 있습니다.를 들어, 「」입니다.printf '\e[34;47;1;3mCRAZY TEXT\n'CRAZY TEXT a blue foreground white background 이.bold ★★★★★★★★★★★★★★★★★」italic.

예:

문자열 속성 결합 예제 스크린샷

할 수을 bash 또는 쉘에 바쉬를 zsh로 해야 할 수).\e\x1b

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

결과:

SGR 상태 1 SGR 상태 2

내 단말기가 희미(2), 은닉(8) 및 십자선(9)을 제외한 모든 텍스트 효과를 지원하는 것을 볼 수 있습니다.

빠른 참조(SGR 속성 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비트 컬러

이를 하지만, ''' 덜 지원됩니다.0-7 ,9★★★★★★ 。

구문:

  • CSI 38;5; n m
    • CSI 문자: : " " " : "^[[또는
    • 38;5;: "8비트"
    • n: 호:: 음음음음 : : :.
      • 0-255

만약 당신이 단말기의 모든 색상을 좋은 방법으로 미리 보고 싶다면, gist.github.com에 멋진 스크립트가 있습니다.

다음과 같습니다.

8비트 컬러 스크린샷 예시

색상을 사용하여 배경을 8비트 색상을 .38 a 48:

  • CSI 48;5; n m
    • CSI 문자: : " " " : "^[[또는
    • 48;5;: 의 백그라운드 "8비트"
    • n: 호:: 음음음음 : : :.
      • 0-255

24비트 컬러

진정한 색상으로도 알려진 24비트 색상은 정말 멋진 기능을 제공합니다.이에 대한 지원은 확실히 증가하고 있습니다(제가 아는 한, 제 터미널인 urxvt를 제외한 대부분의 최신 터미널에서 작동됩니다[성난 이모티콘 삽입).

24비트 색상은 실제로 vim에서 지원됩니다(24비트 색상의 유효화에 대해서는, vim Wiki 를 참조해 주세요).gvim에 대해 정의된 색상에서 추출하기 때문에 매우 깔끔합니다.예를 들어 fg/bg를 사용합니다.highlight guibg=#______ guifg=#______ 컬러 24 ne ne ne ne ? ne ,, ??

24비트 색상의 동작은 다음과 같습니다.

  • CSI 38;2; r ; g ; b m
    • CSI 문자: : " " " : "^[[또는
    • 38;2;: "24"
    • r ,g ,b: 여야 합니다: 각음음 음음음 음음음 음 : : : 。0-255

여러 가지 색상 중 몇 가지만 테스트합니다((2^8)^3 ★★★★★★★★★★★★★★★★★」2^24 ★★★★★★★★★★★★★★★★★」16777216제 또는 possibilites, 내를를)에서 할 수 .

  • 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};${b}m($r,$g,$b)\e[0m "; done; printf "\n"; done; done;

결과(urxvt는 24비트 컬러를 지원하지 않으므로 gnome-terminal로 표시됩니다.)정신 차려, urxvt 관리인...실제) :

24비트 컬러 스크린샷 예시

24일...짐작하셨군요!교체만 하면 됩니다.3848:

  • CSI 48;2; r ; g ; b m
    • CSI 문자: : " " " : "^[[또는
    • 48;2;: 의 백그라운드 "24비트"
    • r ,g ,b: 여야 합니다: 각음음 음음음 음음음 음 : : : 。0-255

원시 이스케이프 시퀀스 삽입

★★★★★★★★★★★★★★★★★.\e ★★★★★★★★★★★★★★★★★」\x1b동작하지 않습니다.예를 들어 shshell에서는 어느 쪽도 동작하지 않는 경우가 있습니다(현재는 동작하고 있습니다만, 이전에는 동작하지 않았던 것 같습니다).

이를 회피하려면 +,VCTRL[ + 또는 ESC를 사용합니다.

이렇게 하면 "raw" 문자(ASCII: 27)가 삽입됩니다.이렇게 될 것이다.^[아, 아, 아, 아, 아, 아, 아, 아.두 글자가 아니라 한 글자에 불과합니다.

예:

sh raw escape char 예제 스크린샷


욕설

저주에 대한 자세한 내용은 Curses(프로그래밍 라이브러리) 페이지를 참조하십시오.욕은 unix 및 unix 계열 운영체제에서만 작동한다는 점에 유의하십시오.

욕설을 사용한 기동 및 실행

자세한 내용은 설명하지 않겠습니다.검색 엔진은 저보다 훨씬 더 잘 설명할 수 있는 웹사이트 링크를 표시할 수 있기 때문입니다.하지만 여기서 간략하게 설명하고 예를 들어보겠습니다.

ANSI 이스케이프에 저주를 사용하는 이유

글을 , 이 하실 수 .\e ★★★★★★★★★★★★★★★★★」\x1b와 함께 동작하는 경우가 있다printf 가끔은 ,, 끔, 끔, 가.\e ★★★★★★★★★★★★★★★★★」\x1b는 전혀 동작하지 않습니다(이것은 표준이 아니고, 이러한 단말기로 작업한 적은 없지만, 가능합니다).더 중요한 것은 보다 복잡한 이스케이프 시퀀스(think 및 기타 멀티문자 키)는 모든 단말기에 대해 지원하기가 어렵다는 것입니다(단, termfo와 termcap을 해석하고 모든 단말기의 처리방법을 파악하는데 많은 시간과 노력을 들일 필요가 있는 경우를 제외합니다).

욕이 이 문제를 해결한다.기본적으로 단말기는 다음 방법을 사용하여 어떤 기능을 가지고 있는지 이해할 수 있습니다(위 링크된 위키피디아 문서에서 설명).

대부분의 저주 구현은 수천 개의 다른 단말기의 기능을 설명할 수 있는 데이터베이스를 사용합니다.PDCurses 등 터미널 데이터베이스가 아닌 특수한 디바이스 드라이버를 사용하는 구현이 몇 가지 있습니다.대부분의 구현에서는 termfo를 사용합니다.termcap을 사용하는 경우도 있습니다.Curses는 문자 셀 단말기에 대한 백포터빌리티와 단순성이라는 장점이 있습니다.비트맵 그래픽스나 여러 글꼴을 필요로 하지 않는 어플리케이션에서는 일반적으로 욕을 사용하는 인터페이스 구현이 X 툴킷을 사용하는 것보다 훨씬 간단하고 빠릅니다.

대부분의 경우 욕은 termfo를 폴링하고 커서 및 텍스트 속성을 조작하는 방법을 이해할 수 있습니다.그런 다음 프로그래머인 사용자는 욕이 제공하는 API를 사용하여 커서를 조작하거나 원하는 기능을 원하는 경우 텍스트 색상 또는 기타 속성을 변경할 수 있습니다.

Python을 사용한 예

python은 매우 사용하기 쉽지만, 다른 프로그래밍 언어로 욕설을 사용하고 싶다면 duckduckgo나 다른 검색 엔진에서 검색하기만 하면 됩니다.:) 다음은 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)

결과:

여기에 이미지 설명 입력

이것이 훨씬 더 우회적인 작업 방식이라고 생각할 수도 있지만, 실제로는 훨씬 더 크로스 플랫폼(최소한 Unix 및 Unix와 유사한 플랫폼 세계에서는 크로스 터미널)입니다.색상에 대해서는 그다지 중요하지 않지만, 다른 다중 시퀀스 이스케이프 시퀀스( , , , 등)를 서포트하는 경우는, 욕이 한층 더 중요해집니다.

Tput의 예

  • tput 및 하기 위한 입니다.
  • tput에 부속되어 있습니다.curses) 하는 경우해야 합니다. 또는 등)를 이스케이프 시퀀스를 하기 때문입니다.단말기에서 크로스 터미널(ish) 애플리케이션을 사용하는 경우 tput을 사용해야 합니다.이는 terminfo 또는 필요한 모든 것을 해석하고 표준화된 명령어 세트(저주 등)를 사용하여 올바른 이스케이프 시퀀스를 반환하기 때문입니다.
  • 예:
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\!"

결과:

tput을 사용한 예

Tput 상세 정보

  • tput 의 동작에 대해서는, http://linuxcommand.org/lc3_adv_tput.php 를 참조해 주세요.
  • 사용할 수 있는 명령어 목록은http://http://invisible-island.net/ncurses/man/terminfo.5.html 를 참조해 주세요.

이것은 나에게 효과가 있었다.

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

색을 흰색(또는 사용하던 것)으로 되돌리려면 "37m"이라는 엔딩이 필요합니다.그렇지 않으면 모든 것이 빨간색으로 변할 수 있습니다.

아니요, 하지만 이를 처리할 수 있는 서드파티 API가 있습니다.

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

편집: 물론 제가 올린 기사보다 새로운 기사도 있지만, 정보는 아직 유효합니다.

위의 링크는 데드입니다.대신 다음 질문을 참조하십시오.System.out.println을 사용하여 콘솔에서 색상을 인쇄하는 방법

Windows 에서는, JANSI 라이브러리를 사용해 ANSI 이스케이프 시퀀스를 렌더링 할 수 있습니다.

네, 100% 가능합니다.

set classpath= %classpath%;d:\jansi-1.4.jar;

아래 코드를 사용해 보십시오.

import org.fusesource.jansi.AnsiConsole;
import static org.fusesource.jansi.Ansi.*;
import static org.fusesource.jansi.Ansi.Color.*;

public class Sample

{

  public static void main(String[] args)
  {
    AnsiConsole.systemInstall();

    System.out.println(ansi().fg(RED).a("Hello World").reset());
    System.out.println("My Name is Raman");

    AnsiConsole.systemUninstall();
  }
}

다음은 Win32 Console용 솔루션입니다.

1) Java Native Access 라이브러리를 입수하려면 https://github.com/twall/jna/

2) 이 2개의 Java 클래스가 유효합니다.

즐거운 시간 되세요.

package com.stackoverflow.util;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Structure;

public class Win32 {
    public static final int STD_INPUT_HANDLE = -10;
    public static final int STD_OUTPUT_HANDLE = -11;
    public static final int STD_ERROR_HANDLE = -12;

    public static final short CONSOLE_FOREGROUND_COLOR_BLACK        = 0x00;
    public static final short CONSOLE_FOREGROUND_COLOR_BLUE         = 0x01;
    public static final short CONSOLE_FOREGROUND_COLOR_GREEN        = 0x02;
    public static final short CONSOLE_FOREGROUND_COLOR_AQUA         = 0x03;
    public static final short CONSOLE_FOREGROUND_COLOR_RED          = 0x04;
    public static final short CONSOLE_FOREGROUND_COLOR_PURPLE       = 0x05;
    public static final short CONSOLE_FOREGROUND_COLOR_YELLOW       = 0x06;
    public static final short CONSOLE_FOREGROUND_COLOR_WHITE        = 0x07;
    public static final short CONSOLE_FOREGROUND_COLOR_GRAY         = 0x08;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_BLUE   = 0x09;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_GREEN  = 0x0A;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_AQUA   = 0x0B;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_RED    = 0x0C;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_PURPLE = 0x0D;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_YELLOW = 0x0E;
    public static final short CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE = 0x0F;

    public static final short CONSOLE_BACKGROUND_COLOR_BLACK        = 0x00;
    public static final short CONSOLE_BACKGROUND_COLOR_BLUE         = 0x10;
    public static final short CONSOLE_BACKGROUND_COLOR_GREEN        = 0x20;
    public static final short CONSOLE_BACKGROUND_COLOR_AQUA         = 0x30;
    public static final short CONSOLE_BACKGROUND_COLOR_RED          = 0x40;
    public static final short CONSOLE_BACKGROUND_COLOR_PURPLE       = 0x50;
    public static final short CONSOLE_BACKGROUND_COLOR_YELLOW       = 0x60;
    public static final short CONSOLE_BACKGROUND_COLOR_WHITE        = 0x70;
    public static final short CONSOLE_BACKGROUND_COLOR_GRAY         = 0x80;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_BLUE   = 0x90;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_GREEN  = 0xA0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_AQUA   = 0xB0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_RED    = 0xC0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_PURPLE = 0xD0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_YELLOW = 0xE0;
    public static final short CONSOLE_BACKGROUND_COLOR_BRIGHT_WHITE = 0xF0;

    // typedef struct _COORD {
    //    SHORT X;
    //    SHORT Y;
    //  } COORD, *PCOORD;
    public static class COORD extends Structure {
        public short X;
        public short Y;
    }

    // typedef struct _SMALL_RECT {
    //    SHORT Left;
    //    SHORT Top;
    //    SHORT Right;
    //    SHORT Bottom;
    //  } SMALL_RECT;
    public static class SMALL_RECT extends Structure {
        public short Left;
        public short Top;
        public short Right;
        public short Bottom;
    }

    // typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
    //    COORD      dwSize;
    //    COORD      dwCursorPosition;
    //    WORD       wAttributes;
    //    SMALL_RECT srWindow;
    //    COORD      dwMaximumWindowSize;
    //  } CONSOLE_SCREEN_BUFFER_INFO;
    public static class CONSOLE_SCREEN_BUFFER_INFO extends Structure {
        public COORD dwSize;
        public COORD dwCursorPosition;
        public short wAttributes;
        public SMALL_RECT srWindow;
        public COORD dwMaximumWindowSize;
    }

    // Source: https://github.com/twall/jna/nonav/javadoc/index.html
    public interface Kernel32 extends Library {
        Kernel32 DLL = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

        // HANDLE WINAPI GetStdHandle(
        //        __in  DWORD nStdHandle
        //      );
        public int GetStdHandle(
                int nStdHandle);

        // BOOL WINAPI SetConsoleTextAttribute(
        //        __in  HANDLE hConsoleOutput,
        //        __in  WORD wAttributes
        //      );
        public boolean SetConsoleTextAttribute(
                int in_hConsoleOutput, 
                short in_wAttributes);

        // BOOL WINAPI GetConsoleScreenBufferInfo(
        //        __in   HANDLE hConsoleOutput,
        //        __out  PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
        //      );
        public boolean GetConsoleScreenBufferInfo(
                int in_hConsoleOutput,
                CONSOLE_SCREEN_BUFFER_INFO out_lpConsoleScreenBufferInfo);

        // DWORD WINAPI GetLastError(void);
        public int GetLastError();
    }
}
package com.stackoverflow.util;

import java.io.PrintStream;

import com.stackoverflow.util.Win32.Kernel32;

public class ConsoleUtil {
    public static void main(String[] args)
    throws Exception {
        System.out.print("abc");
        static_color_print(
                System.out, 
                "def", 
                Win32.CONSOLE_BACKGROUND_COLOR_RED, 
                Win32.CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE);
        System.out.print("def");
        System.out.println();
    }

    private static Win32.CONSOLE_SCREEN_BUFFER_INFO _static_console_screen_buffer_info = null; 

    public static void static_save_settings() {
        if (null == _static_console_screen_buffer_info) {
            _static_console_screen_buffer_info = new Win32.CONSOLE_SCREEN_BUFFER_INFO();
        }
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, _static_console_screen_buffer_info);
    }

    public static void static_restore_color()
    throws Exception {
        if (null == _static_console_screen_buffer_info) {
            throw new Exception("Internal error: Must save settings before restore");
        }
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        Kernel32.DLL.SetConsoleTextAttribute(
                stdout_handle, 
                _static_console_screen_buffer_info.wAttributes);
    }

    public static void static_set_color(Short background_color, Short foreground_color) {
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        if (null == background_color || null == foreground_color) {
            Win32.CONSOLE_SCREEN_BUFFER_INFO console_screen_buffer_info = 
                new Win32.CONSOLE_SCREEN_BUFFER_INFO();
            Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, console_screen_buffer_info);
            short current_bg_and_fg_color = console_screen_buffer_info.wAttributes;
            if (null == background_color) {
                short current_bg_color = (short) (current_bg_and_fg_color / 0x10);
                background_color = new Short(current_bg_color);
            }
            if (null == foreground_color) {
                short current_fg_color = (short) (current_bg_and_fg_color % 0x10);
                foreground_color = new Short(current_fg_color);
            }
        }
        short bg_and_fg_color = 
            (short) (background_color.shortValue() | foreground_color.shortValue());
        Kernel32.DLL.SetConsoleTextAttribute(stdout_handle, bg_and_fg_color);
    }

    public static<T> void static_color_print(
            PrintStream ostream, 
            T value, 
            Short background_color, 
            Short foreground_color)
    throws Exception {
        static_save_settings();
        try {
            static_set_color(background_color, foreground_color);
            ostream.print(value);
        }
        finally {
            static_restore_color();
        }
    }

    public static<T> void static_color_println(
            PrintStream ostream, 
            T value, 
            Short background_color, 
            Short foreground_color)
    throws Exception {
        static_save_settings();
        try {
            static_set_color(background_color, foreground_color);
            ostream.println(value);
        }
        finally {
            static_restore_color();
        }
    }
}

가장 간단한 방법은 Cygwin 콘솔에서 프로그램을 실행하는 것입니다(수정되지 않음).

두 번째로 간단한 방법은 일반적인 Windows 콘솔에서 프로그램을 실행하고(또한 수정되지 않음) tee.exe를 통해 출력을 파이프라인하는 것입니다(Cygwin 또는 Git 배포).Tee.exe는 이스케이프 코드를 인식하고 적절한 WinAPI 함수를 호출합니다.

예를 들어 다음과 같습니다.

java MyClass | tee.exe log.txt
java MyClass | tee.exe /dev/null

는 작했니 a 를 만들었다.jarJCDP(Java Colored Debug Printer)라고 불리는 라이브러리입니다.

Linux의 경우 WhiteFang이 언급한 ANSI 이스케이프 코드를 사용하지만 훨씬 직관적인 코드 대신 단어를 사용하여 추상화합니다.

Windows 에서는, 실제로는 JANsi 라이브러리가 포함되어 있습니다만, 그 위에 추상화 레이어를 작성하기 때문에, Linux 용으로 작성된 직관적이고 심플한 인터페이스를 유지할 수 있습니다.

이 라이브러리는 MIT 라이선스에 따라 라이선스가 부여되어 있으므로 자유롭게 사용하시기 바랍니다.

JCDP의 github 저장소를 살펴보십시오.

이스케이프 시퀀스를 색상으로 변환하려면 SHITHING에 의해 해석되어야 합니다.표준 CMD입니다.명령줄에서 시작할 때 Java가 사용하는 EXE는 이를 지원하지 않으므로 Java는 지원하지 않습니다.

[이 출력(This Out)]체크박스는 이스케이프 코드와 함께 ANSI 값을 사용했는데 Windows 명령어프롬프트에서는 동작하지 않지만 IDE와 Unix 쉘에서는 동작합니다.Windows 의 서포트에 대해서는, 여기서 「Jansi」라이브러리를 참조해 주세요.

System.out.println("\u001B[35m" + "This text is PURPLE!" + "\u001B[0m");

ANSIScape라는 라이브러리를 작성했습니다.이 라이브러리를 사용하면 컬러 출력을 보다 구조적으로 쓸 수 있습니다.

예:

AnsiScape ansiScape = new AnsiScape();
String colors = ansiScape.format("{red {blueBg Red text with blue background}} {b Bold text}");
System.out.println(colors);

또한 라이브러리에서는 css 클래스와 유사한 자체 "에스케이프 클래스"를 정의할 수 있습니다.

예:

AnsiScapeContext context = new AnsiScapeContext();

// Defines a "class" for text
AnsiClass text = AnsiClass.withName("text").add(RED);
// Defines a "class" for the title used
AnsiClass title = AnsiClass.withName("title").add(BOLD, BLUE_BG, YELLOW);
// Defines a "class" to render urls
AnsiClass url = AnsiClass.withName("url").add(BLUE, UNDERLINE);

// Registering the classes to the context
context.add(text).add(title).add(url);

// Creating an AnsiScape instance with the custom context
AnsiScape ansiScape = new AnsiScape(context);

String fmt = "{title Chapter 1}\n" +
              "{text So it begins:}\n" +
              "- {text Option 1}\n" +
              "- {text Url: {url www.someurl.xyz}}";

System.out.println(ansiScape.format(fmt));

System.err.println("Errorrrrr") 콘솔의 빨간색 텍스트가 인쇄됩니다.

이건 일식일 때도 빨갛게 할 수 있어 다른 곳은 몰라도

System.err.println(" BLABLA ");

언급URL : https://stackoverflow.com/questions/1448858/how-to-color-system-out-println-output

반응형