mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-01-09 14:10:57

ANSI 이스케이프 코드

1. 역사2. 사용3. 문법
3.1. SGR(Select Graphic Rendition) 관련
4. ANSI 색상 코드5. 지원 현황


ANSI 이스케이프 코드는 터미널을 제어하는데 사용되는 표준이다.

1. 역사

터미널은 원래 전신타자기라고 불리는 일종의 프린터였고 아주 기본적인 제어 동작만을 가지고 있었는데 커서의 위치를 이동시키는 것은 개행이나 캐리지 리턴 정도만 가능했고 한번 인쇄된 문자를 바꾸는 것은 불가능했다. 이후 디스플레이에 출력되는 전자 제어식 터미널이 보급되면서 더 다양한 동작이 가능해졌는데 출력된 문자를 지우는 것도 가능하고 커서를 임의의 위치로 이동시키는 동작이 가능해졌다. 초기에는 표준이 정해지지 않아 터미널을 설계하는 회사마다 동작이 달랐는데 각 회사의 제품마다 지원되는 기능이 다르고 비슷하거나 같은 기능이여도 사용법이 다르는 등 호환성에 악영향을 끼쳤다. 그래서 터미널의 동작을 통일시켜야 할 필요성이 생겼고 터미널이 가져야 할 기본적인 동작들을 모아 ANSI 이스케이프 시퀀스 표준이 탄생한다.

2. 사용

파일:attachment/1275273992_asciitable.gif
거의 모든 동작은 16진수 값으로 0x1B, 8진수 값으로 \\033을 가지는 ESC(escape) 문자로 시작한다. 일반적으로 키보드로는 입력할 수 있는 방법이 없기 때문에 이 문자를 입력하는 방법은 환경에 따라 약간 다르다. 셸이 이스케이핑을 지원하는 경우 \\033으로 입력할 수 있고 bash의 경우 기본적으로 Ctrl+V키를 사용하면 제어 문자를 입력 가능하기 때문에 그 상태에서 ESC 키를 누르면 입력 가능하다.

ESC 문자 뒤로 오는 몇가지 문자가 동작을 결정하는데 거의 대부분의 기능은 [를 사용하는 CSI(control sequence introducer)로 시작한다. 이 문자가 제공하는 기능은 커서 조작, 색상, 터미널 제어등의 여러가지 기능들을 가지고 있다.

3. 문법

거의 대부분의 기능은 CSI로 시작하기 때문에 이스케이프 문자는 생략한다. 동작에는 인자가 필요한 경우가 있는데 없으면 기본 동작이 있다. 인자가 두개 이상 필요할 경우 각 인자를 세미콜론으로 구분한다. 주의해야 할 점은 세미콜론이 모든 셸에서 명령어의 끝으로 인식하기 때문에 오동작이 발생할 가능성이 있으므로 따옴표로 감싸거나 이스케이프 처리를 하는 것이 권장된다.
명칭 명령어 동작 특징
CUU(Cursor Up) nA n만큼 커서가 위로 이동한다. 인자가 생략되었을 경우 n이 1인 것으로 간주한다. 방향키는 인자가 생략된 A,B,C,D로 표현되는 경우가 있다.
CUD(Cursor Down) nB 커서가 아래로 이동한다.
CUF(Cursor Right) nC 앞 또는 오른쪽으로 이동한다.
CUB(Cursor Left) nD 뒤로 또는 왼쪽으로 이동한다.
CNL(Cursor Next Line) nE 다음 줄로 이동한다. n의 기본값은 1이다.
CPL(Cursor Precending Line) nF 이전 줄로 이동한다.
CHA(Cursor Character Absolute, Cursor Horizontal Absolute) nG 커서를 현재 줄에서 n에 해당하는 열로 이동한다. 인자가 생략되었을 경우, 동작은 캐리지 리턴과 비슷하다.
CUP(Cursor Position) r;cH r: row, c: column에 해당하는 위치로 이동한다.
ED(Erase In Page) nJ 디스플레이를 지운다.
EL(Erase In Line) nK 현재 줄을 지운다. 커서의 위치는 고정된다.
SU(Scroll Up) nS
SD(Scroll Down) nT
HVP(Character and Line Position) r;cf CUP와 같지만 일부 동작이 다르다.

3.1. SGR(Select Graphic Rendition) 관련

SGR은 문자의 모양과 출력 형태, 색상등을 담당하는 명령인데 주의할 점은 하드웨어나 구현마다 동작과 세부 사항이 다를 수 있다.

SGR의 문법은 CSI로 시작하고 몇가지 인자를 받은 뒤에 m으로 끝난다.
번호 설명 특징
0 모든 속성을 초기화한다. SGR에 인자가 지정되지 않은 경우의 기본값이다.
1 볼드 혹은 강도 증가 볼드가 적용/해제되거나(지원되는 경우) 그렇지 않은 경우 색상이 진해지거나 옅어진다.
2 볼드 해재, 강도 감소
3 이탤릭체 적용
4 밑줄 적용
5 텍스트 반짝임 느리게 적용 텍스트가 사라졌다가 없어졌다가를 반복한다. 텍스트 중간에만 적용시키려면 0m으로 해제하면 된다.
6 텍스트 반짝임 빠르게 적용 지원되지 않는 경우가 더 많다.
30-37 텍스트의 전경색을 설정 색상은 아래의 표를 참조
38 텍스트의 전경색을 설정 5;nm의 형식으로 16가지 색상을 직접 표현하거나 (지원되는 경우) 2;r;g;bm으로 삼원색을 설정 가능하다.
39 텍스트의 전경색을 복구 구현체에 따라 달라진다.
40-47 텍스트의 배경색을 설정 색상은 아래의 표를 참조
48 텍스트의 배경색을 설정 38과 비슷하지만 배경색에 적용된다.
49 텍스트의 배경색을 복구 39와 비슷하지만 배경색에 적용된다.
90-97 텍스트의 밝은 전경색을 설정 30-37보다 더 밝은 색상이 적용된다.
100-107 텍스트의 밝은 배경색을 설정 40-47보다 더 밝은 색상이 적용된다.

4. ANSI 색상 코드

RGB 3비트 색상과 밝은 색 변형이 존재하는 4비트가 사용된다. 몇몇 가상 터미널에서는 24비트 컬러까지 지원하기도 하는데 굉장히 드물고 대부분 4비트까지는 지원한다. 하지만 ANSI 색상과 그 세부 표현은 ANSI 이스케이프 코드 표준의 일부분이기 때문에 어떤 콘솔이 4비트 색상을 지원한다해도 출력 결과물은 다를 수도 있다. 그 예시로 Microsoft Windows 명령 프롬프트의 color 내장 명령어도 비슷하게 4비트 색상을 사용하지만 색상 순서가 ANSI의 것과는 다르다.

3비트 색상은 R, G, B에 1비트씩 사용하여 기본 8가지 색상을 만든다. 4비트 색상은 MSB에 기존 8가지 색상들의 명도 또는 채도를 올리는 옵션을 추가한다. 8비트 색상은 4비트 색상의 16색에 RGB 각각 6단계로 216가지 색상을 만들고 24개의 그레이 스케일을 지원해 총 256가지의 색상을 구현한다. 24비트의 경우 자주 쓰이는 트루 컬러와 같아 색 지정에 쓰이는 문법이 다르다.
번호 비고
0
1
2
3 일부 기기에서는 주황색 또는 갈색으로 표시될 수 있다.
4
5 PowerShell에는 이 색상이 다른 색상으로 매치되었다.
6
7 이 색상이 충분히 밝을 경우 흰색과 동일한 색상을 가질수도 있다.
8 Ubuntu 기본 터미널에서는 배경색인 짙은 보라색으로 표시된다.
9
10/a
11/b
12/c
13/d
14/e
15/f 일부 환경에 따라 완전한 흰색이 아닐수도 있다.

x86 호환의 VGA는 4비트 배경색을 지원하지 않는다. 문자 표시에는 8비트를 사용하는데 전경색에 4비트, 배경색에 3비트, 깜빡임 여부에 1비트를 사용해서 발생하는 일이다. GUI 위에서 구동되는 유명한 가상 터미널 앱들은 24비트 색상을 지원하는 경우가 많은데 글꼴의 크기를 충분히 작게 줄일 수 있다면 터미널에서 사진 출력이나 동영상 출력도 가능해진다.

5. 지원 현황

Linux, macOS, BSD 등의 UNIX 계열 또는 호환 시스템들은 잘 지원하는 경우가 많다. 정확히는 해당 시스템의 터미널 환경이 지원하는 것이다. Microsoft Windows의 경우 명령 프롬프트는 일반적으로 지원하지도 않고 이스케이프 문자들이 대부분 특수 기호에 할당되어 있어 문자로 출력되지만 WSL에서는 잘 동작하여 호환성이 있다. 콘솔의 내부적인 동작을 바꾼 것으로 보인다. 원래 윈도우 콘솔창은 간단한 자리 이동에도 windows.h, conio.h 등의 헤더 파일을 불러와서 gotoxy 함수를 호출하는 것이 더 일반적이다.