카테고리 없음

[C ++] 콘솔에서 컬러 텍스트를 출력하기 위해 ANSI 이스케이프 코드를 사용하는 방법

행복을전해요 2020. 12. 10. 04:57

유감스럽게도 ESC 문자를 잊어 버렸습니다.

#include <cstdio>

int main()
{
    printf("%c[%dmHELLO!\n", 0x1B, 32);
    }
    

불행히도 ANSI 이스케이프 시퀀스를 지원하는 콘솔에서만 작동합니다 (예 : bash를 사용하는 Linux 콘솔 또는 ansi.sys를 사용하는 이전 Windows 콘솔).

-------------------

저는 얼마 전에 매우 간단한 텍스트 관리 라이브러리를 만들었습니다. 멀티 플랫폼이기 때문에 Windows 용 네이티브 API 호출과 나머지 플랫폼 용 ANSI 이스케이프 시퀀스를 사용합니다. 완전히 문서화되어 있으며 소스 코드를 찾아 볼 수도 있습니다.

특정 질문에 대해 일부 코드가 누락되었다고 생각합니다. 예를 들어, 텍스트 색상을 변경하려면 다음과 같은 것을 사용해야합니다.

static const char * CSI = "\33[";
printf( "%s%s", CSI, "31m" );   // RED

도움이 되었기를 바랍니다.

-------------------

ANSI 이스케이프 코드는 ansi.sys 장치 드라이버를 사용하여 DOS에서 작동했습니다. 그들은 Windows XP 이상에서 작동하지 않습니다. 콘솔 API 를 사용해야합니다. SetConsoleTextAttribute()

textcolor 볼랜드 터보 C ++ 컴파일러에서 사용할 수있었습니다.

-------------------

이 게시물을 읽는 모든 사람에게 보내는 메모 : https://en.wikipedia.org/wiki/ANSI_escape_code#DOS_and_Windows

2016 년에 Microsoft는 예기치 않게 ANSI 이스케이프 시퀀스 지원을 구현 한 Windows 10 버전 1511 업데이트를 출시했습니다. 이 변경 사항은 Linux 용 Windows 하위 시스템을 보완하기 위해 설계되었으며 명령 프롬프트에서 사용하는 Windows 콘솔 호스트에 Unix 계열 시스템 용 터미널 기반 소프트웨어에서 사용하는 문자 이스케이프 코드 지원을 추가했습니다. 이것은 기본 동작이 아니며 다음을 통해 Win32 API를 사용하여 프로그래밍 방식으로 활성화해야합니다.SetConsoleMode(handle, ENABLE_VIRTUAL_TERMINAL_PROCESSING)

-------------------

Windows 10은 VT100에서 ANSI 이스케이프 시퀀스를 지원하고 256 색 확장이있는 파생 된 터미널 에뮬레이터 기술을 지원합니다. 설명과 예는 콘솔 가상 터미널 시퀀스 페이지에 있습니다.

std::ostringstream ss;
for (int i = 0; i < 10; ++i)
    ss << "\x1b[38;2;" << 5 * i << ";" << 255 - 10 * i << ";220m" 
            << "ANSI Escape Sequence " << i << std::endl;   
            std::cout << ss.str();
            
-------------------

ANSI 형식화 코드는 Windows에서 지원되지 않습니다.

http://en.wikipedia.org/wiki/ANSI_escape_code

-------------------

Windows 10에서는 현재 콘솔에서 VT100 모드를 활성화하여 VT100 스타일을 사용할 수 있습니다.

#include <windows.h>
#include <iostream>

#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#define DISABLE_NEWLINE_AUTO_RETURN  0x0008

int main(){
   DWORD l_mode;
      HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
         GetConsoleMode(hStdout,&l_mode);
            SetConsoleMode( hStdout, l_mode |
                            ENABLE_VIRTUAL_TERMINAL_PROCESSING |
                                            DISABLE_NEWLINE_AUTO_RETURN );
                                            
                                               for (int i = 0; i < 10; ++i)
                                                     std::cout << "\x1b[38;2;" << 5 * i << ";" << 255 - 10 * i << ";220m" 
                                                                  << "ANSI Escape Sequence " << i << std::endl;
                                                                  }
                                                                  

msdn 페이지 참조 : [ https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences][1]

-------------------

이것은 ANSI 이스케이프 시퀀스를 지원하는 모든 OS에서 작동합니다.

#include <iostream>
    
    void printColored(char r, char g, char b, char _char_) {
      std::cout << '\33' << '[' << '38' << ';' << '2' << ';' << r << ';' << g << ';' << b << 'm' << _char_ << '\33' << '[' << 'm'
      }
      

노트 :

char r은 RGB의 빨간색입니다.

char g는 RGB의 녹색입니다.

char b는 RGB의 파란색입니다.

char char 은 컬러 텍스트로 인쇄 할 문자입니다.

이것은 ANSI Escape를 사용하여 ANSI Color Specific RGB Sequence Bash 에서 RGB 색상 텍스트를 출력하는 것에 대한 답변 일 수 있습니다.

사실이 아니라고 생각하시면 그냥 편집하시면됩니다.



출처
https://stackoverflow.com/questions/7414983