escape codes의 이해

escape code의 ISO 6429에서 정의된 정확한 명칭은 control function이다. control function을 표현하는 코드 혹은 시퀀스를 흔히 escape code라고 말한다. ISO 6429가 정의하는 컨트롤 코드는 모양에 따라 C0 코드와 C1 코드로 나누어진다.

C0 코드는 ASCII Table에서 non-printing 문자에 해당하는 코드이다. 아마 Escape Codes 중 개발자들에게 가장 익숙한 코드일 것이다. 라인 피드(\n), 캐리지 리턴(\r), 탭(\t), 널 문자(\0) 등이 여기에 해당한다.

C1 코드는 0x80에서 0x9F 사이 32개의 1바이트 값으로 표현되는 코드다. C0와 다르게 C1 코드는 ASCII에 정의된 값이 아니다. ASCII만 지원하는 터미널, 다시 말해 7비트 환경에서만 사용할 수 있고, 8비트 환경인 현대 터미널에서는 사용될 수 없다. 그래서 현대 터미널은 대부분 C1 코드가 필요할 때 escape sequence로 표현한다.

escape sequence란 말 그대로 ESC를 시작으로 하는 일련의 문자열을 의미한다. 그중 C1 코드와 같은 기능을 하는 시퀀스는 첫 바이트가 ESC(0x1B)이고 두 번째 바이트가 @(0x40)에서 _(0x5F)로 이루어지는 두 바이트의 시퀀스다. 예를 들면 IND는 8비트 환경에서는 0x84로 표현되지만 7비트 환경에서는 ESC D(0x1B 0x44)로 표현된다. 이 두 번째 바이트는 Final character of Escape sequence라는 의미로 Fe라고 불리며, 두 바이트로 표현된 C1 코드를 Fe sequence라고 부르기도 한다.

ISO 6429가 정의하는 escape sequence는 Fe sequence 이외에도 더 있다. 예를 들면 `(0x60)에서 ~(0x7E) 사이의 값은 Fs라고 불리며, ESC 다음 Fs가 따라오는 시퀀스는 Fs sequence라고 불린다. 또한 Fs sequence는 C1 코드와 달리 7비트 환경과 8비트 환경 구분 없이 언제나 escape sequence로 표현되기 때문에 independent control functions라고 불리기도 한다.

Fe sequenceFs sequence는 주로 터미널 디바이스를 제어하기 위한 명령어를 제공한다. 따라서 터미널 에뮬레이터를 사용하는 현대에는 거의 사용할 일이 없다. 이보다는 CSI(Control Sequence Introducer)로 시작하는 control sequence를 주로 사용한다.

CSI는 C1 컨트롤 코드에 정의된 값으로, 7비트 환경에서는 0x9B, 8비트 환경에서는 ESC [(0x1B 0x5B)로 표현된다. CSI부터 @(0x40)에서 ~(0x7E)로 끝나는 일련의 시퀀스는 control sequence로 불리는데 커서 위치부터 시작해서 폰트나 색상 등 다양한 것을 조정할 수 있다. 다음 글에서 이에 대해 자세히 다뤄보도록 하겠다.

댓글

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

RAII는 무엇인가

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API