# C0 및 C1 제어 코드

**C0 및 C1 제어 코드** 세트는 ASCII 및 ASCII 파생형을 사용하는 컴퓨터 시스템에서 텍스트에 사용하기 위한 제어 문자 세트를 정의한다. 이 코드들은 커서의 위치, 새 줄 시작 명령, 또는 텍스트 수신 완료 메시지와 같은 텍스트에 대한 추가 정보를 나타낸다.

C0 코드는 00HEX–1FHEX 범위에 해당하며, 기본 C0 세트는 원래 ISO 646 (ASCII)에서 정의되었다. C1 코드는 80HEX–9FHEX 범위에 해당하며, 기본 C1 세트는 원래 ECMA-48 (나중에 ISO 6429와 일치됨)에서 정의되었다. 제어 및 그래픽 문자를 지정하는 ISO/IEC 2022 시스템을 통해 특수 용도로 다른 C0 및 C1 세트를 사용할 수 있지만, 실제로 사용되는 경우는 드물다.

## C0 제어 문자

ASCII는 32개의 제어 문자와 DEL 문자를 정의한다. 당시에는 다중 바이트 제어가 터미널에 상태 머신 구현을 요구했기 때문에, 당시의 전자 공학 및 기계식 터미널로는 구현하기가 매우 어려워 이처럼 많은 수의 단일 바이트 코드가 선호되었다.

오늘날까지 사용되는 코드는 BEL, ESC, 그리고 형식 효과 장치(format effector) (FEn) 문자인 BS, HT, LF, VT, FF, CR 정도에 불과하다. 다른 코드들은 사용되지 않거나, NUL이 C 문자열 종단자로 쓰이는 것처럼 다른 의미를 갖게 되었다. ANPA-1312, 커밋, XMODEM과 같은 일부 데이터 전송 프로토콜은 SOH, STX, ETX, EOT, ACK, NAK, SYN을 원래 정의와 유사한 용도로 광범위하게 사용하며, 유닉스 info 형식이나 파이썬의 splitlines 문자열 메서드 등 일부 파일 형식에서는 "정보 분리 문자"(Information Separators, ISn)를 사용한다.

ISO 6429:1992 (또는 ECMA-48:1991)에서는 쓰기 방향에 중립적이 되도록 일부 코드의 명칭이 변경되었다. 표준을 다른 언어로 번역할 때 약어는 변경하지 않는다고 이미 규정되어 있었기 때문에 사용되는 약어는 바뀌지 않았다. 아래 표에는 명칭이 변경된 제어 문자에 대해 새 명칭과 옛 명칭(약어와 일치하는 명칭)을 모두 표시했다.

유니코드는 C0 제어 문자를 화면에 표시할 수 있도록 대체하는 제어 문자 기호 영역을 제공한다. 그러나 캐럿 표기법이 더 자주 사용된다.

원래 ANSI X3.4에서 정의된 ASCII 제어 코드| 캐럿 표기법 | 십진법 | 십육진법 | 약어 | 제어 문자 기호 | 이름 | C 이스케이프 | 설명 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| ^@ | 0 | 00 | NUL | ␀ | Null | \0 | 아무 작업도 하지 않는다. 빈 종이 테이프의 코드이며, 전송 속도를 늦추기 위한 패딩으로도 사용된다. |
| ^A | 1 | 01 | TC1, SOH | ␁ | Start of Heading |  | 메시지 헤딩의 첫 번째 문자이다. |
| ^B | 2 | 02 | TC2, STX | ␂ | Start of Text |  | 헤더를 종료하고 메시지 본문을 시작한다. |
| ^C | 3 | 03 | TC3, ETX | ␃ | End of Text |  | 메시지 본문을 종료하고, 푸터(다음 TC 문자까지)를 시작한다. |
| ^D | 4 | 04 | TC4, EOT | ␄ | 전송 종료 문자 |  | 하나 이상의 메시지 전송을 종료한다. 터미널을 대기 상태로 전환할 수 있다. |
| ^E | 5 | 05 | TC5, ENQ, WRU | ␅ | Enquiry |  | 수신 측에 응답을 유도하여 여전히 존재하는지 확인한다. |
| ^F | 6 | 06 | TC6, ACK | ␆ | 응답 문자 |  | 메시지가 성공적으로 수신되었음을 나타낸다. |
| ^G | 7 | 07 | BEL | ␇ | 경고음 문자, Alert | \a | 운영자의 주의를 환기한다. |
| ^H | 8 | 08 | FE0, BS | ␈ | 백스페이스 | \b | 왼쪽으로 한 칸 이동한다. 다음 문자는 해당 위치에 있던 문자를 겹쳐 쓰거나 대체할 수 있다. |
| ^I | 9 | 09 | FE1, HT | ␉ | Character Tabulation, Horizontal Tabulation | \t | 다음 탭 스톱으로 오른쪽으로 이동한다. |
| ^J | 10 | 0A | FE2, LF | ␊ | Line Feed | \n | 다음 줄의 동일한 위치로 아래로 이동한다(일부 장치에서는 왼쪽 열로도 이동한다). |
| ^K | 11 | 0B | FE3, VT | ␋ | Line Tabulation, Vertical Tabulation | \v | 다음 세로 탭 스톱으로 아래로 이동한다. |
| ^L | 12 | 0C | FE4, FF | ␌ | Form feed | \f | 다음 페이지의 맨 위로 아래로 이동한다. |
| ^M | 13 | 0D | FE5, CR | ␍ | 캐리지 리턴 | \r | 같은 줄에 머물면서 0번 열로 이동한다. |
| ^N | 14 | 0E | SO, LS1 | ␎ | Shift Out |  | 대체 문자 세트로 전환한다. |
| ^O | 15 | 0F | SI, LS0 | ␏ | Shift In |  | SO 이후 정규 문자 세트로 복귀한다. |
| ^P | 16 | 10 | TC7, DC0, DLE | ␐ | Data Link Escape |  | 뒤따르는 제한된 수의 연속 문자가 다른 방식으로 해석되게 한다. |
| ^Q | 17 | 11 | DC1, XON | ␑ | Device Control One |  | 장치를 켜거나(DC1, DC2) 끈다(DC3, DC4).
텔레타이프는 종이 테이프 판독기와 펀치기에 이를 사용했다. DC1의 용도는 사실상 표준인 소프트웨어 흐름 제어가 되었다. |
| ^R | 18 | 12 | DC2, TAPE | ␒ | Device Control Two |  |
| ^S | 19 | 13 | DC3, XOFF | ␓ | Device Control Three |  |
| ^T | 20 | 14 | DC4, ~~TAPE~~ | ␔ | Device Control Four |  |
| ^U | 21 | 15 | TC8, NAK | ␕ | Negative Acknowledge |  | 오류 감지 등 전송 측에 보내는 부정 응답이다. |
| ^V | 22 | 16 | TC9, SYN | ␖ | Synchronous Idle |  | 동기 전송 시스템에서 다른 문자가 전송되지 않을 때 전송된다. |
| ^W | 23 | 17 | TC10, ETB | ␗ | End of Transmission Block |  | 전송 목적으로 데이터가 블록으로 나뉘었을 때 전송 블록의 끝을 나타낸다. |
| ^X | 24 | 18 | CAN | ␘ | Cancel |  | 이전 데이터에 오류가 있거나 무시되어야 함을 나타낸다. |
| ^Y | 25 | 19 | EM | ␙ | End of medium |  | 종이 또는 자기 테이프에서 사용 가능한 부분의 끝에 도달했음을 나타낸다. |
| ^Z | 26 | 1A | SUB | ␚ | 치환 문자 |  | 유효하지 않거나 오류가 있는 것으로 판명된 문자를 대체한다. 무시되어야 한다. |
| ^[ | 27 | 1B | ESC | ␛ | 이스케이프 문자 | \e | 뒤따르는 제한된 수의 바이트의 의미를 변경한다. 오늘날 이는 거의 항상 ANSI 이스케이프 코드를 도입하는 데 사용된다. |
| ^\ | 28 | 1C | IS4, FS | ␜ | File Separator |  | 데이터 구조의 필드를 표시하는 구분 문자로 사용될 수 있다. US가 가장 낮은 단계이며, RS, GS, FS는 그 아래 단계의 항목들로 구성된 그룹을 나누기 위해 단계가 높아진다. SP(공백)은 더 낮은 단계로 간주될 수 있다. |
| ^] | 29 | 1D | IS3, GS | ␝ | Group Separator |  |
| ^^ | 30 | 1E | IS2, RS | ␞ | Record Separator |  |
| ^\_ | 31 | 1F | IS1, US | ␟ | Unit Separator |  |
| 기술적으로 C0 제어 문자 범위는 아니지만, 다음 두 문자는 제어 문자의 일부 특성을 가진 것으로 간주될 수 있다. |
|   | 32 | 20 | SP | ␠ | 공백 |  | 오른쪽으로 한 문자 위치 이동한다. |
| ^? | 127 | 7F | DEL | ␡ | 지움 문자 |  | 무시되어야 한다. 천공 테이프에서 모든 구멍을 뚫어 문자를 삭제하는 데 사용되었다. |

## C1 제어 문자

1973년에 ECMA-35 및 ISO 2022는 8비트 "확장 ASCII" 코드를 해당하는 7비트 코드로 변환하거나 그 반대로 변환하는 방법을 정의하려고 시도했다. 7비트 환경에서 시프트 아웃(SO)은 0x20에서 0x7F까지의 96바이트 (즉, C0 제어 코드를 제외한 모든 문자)의 의미를, 8비트 환경에서 상위 비트가 설정된 상태로 동일한 코드를 사용할 때 출력되는 문자로 변경하도록 했다. 이는 0x80에서 0x9F 범위가 7비트 환경에서는 출력될 수 없음을 의미했으므로, 어떠한 대체 문자 세트도 이 범위를 사용할 수 없도록 결정되었고, 이 코드들은 추가 제어 코드가 되었으며 이는 **C1 제어 코드**로 알려지게 되었다. 7비트 환경에서 이 새로운 제어 문자를 사용할 수 있도록 `ESC @`부터 `ESC _`까지의 시퀀스를 동등한 것으로 간주했다. 나중에 ISO/IEC 8859 표준은 7비트 코드 지원을 중단했지만 이 제어 문자 범위는 유지했다.

ISO 2022에 사용하기 위해 등록된 최초의 C1 제어 코드 세트는 1979년에 서지용 특수 세트로 등록된 DIN 31626이다.

더 흔한 일반 용도의 ISO/IEC 6429 세트는 1983년에 등록되었으나, 그 기반이 된 ECMA-48 사양은 1976년에 처음 발표되었으며 JIS X 0211 (이전의 JIS C 6323)도 있었다. RFC 1345 및 ISO 10646 초기 초안에서 정의되었으나 ISO/IEC 6429에는 없는 기호 명칭(PAD, HOP, SGC)도 사용된다.

EUC-JP 텍스트의 SS2 및 SS3, 그리고 EBCDIC에서 변환된 텍스트의 NEL을 제외하고, 이 코드들의 8비트 형태는 거의 사용되지 않았다. CSI, DCS, OSC는 터미널 제어에 사용되지만, 거의 항상 7비트 이스케이프 코드 표현으로 사용된다. 오늘날 이 코드들을 마주친다면, 해당 위치를 인쇄 문자로 사용하는 Windows-1252나 Mac OS Roman으로 의도된 것일 가능성이 훨씬 높다.

NEL을 제외하고, 유니코드는 이들에 대해 "제어 문자 기호"를 제공하지 않는다. 캐럿 표기법의 잘 알려진 변형도 존재하지 않는다.

ISO/IEC 6429 및 RFC 1345 C1 제어 코드| ESC+ | 십진법 | 십육진법 | 약어 | 이름 | 설명 |
| --- | --- | --- | --- | --- | --- |
| @ | 128 | 80 | PAD | Padding Character | 단일 바이트 문자를 두 바이트 길이로 만들어 다중 바이트 문자와의 상호운용성을 쉽게 하기 위한 "패딩" 또는 "상위 바이트"로 제안되었다. 확장 유닉스 코드(EUC)에서 가끔 사용된다. |
| A | 129 | 81 | HOP | High Octet Preset | 데이터 압축의 단순한 형태로, 다중 바이트 문자 시퀀스의 상위 바이트를 설정하여 각 문자가 한 바이트만 필요하도록 제안되었다. |
| B | 130 | 82 | BPH | Break Permitted Here | 줄 바꿈이 허용되는 그래픽 문자 뒤에 온다. 줄 바꿈 시 무엇이 인쇄될지 정의하지 않는다는 점을 제외하면 소프트 하이픈이나 폭 없는 공백과 대략 유사하다. |
| C | 131 | 83 | NBH | No Break Here | 줄 바꿈을 하지 않을 그래픽 문자 뒤에 온다. 단어 결합자를 참조하라. |
| D | 132 | 84 | IND | Index | 가로로 이동하지 않고 한 줄 아래로 이동하여 LF의 의미에 대한 모호성을 제거한다. |
| E | 133 | 85 | NEL | Next Line | CR+LF와 동일하며, EBCDIC 제어 문자와 일치한다. |
| F | 134 | 86 | SSA | Start of Selected Area | 블록 지향 터미널에서 사용된다. Xterm에서 `ESC F`는 특정 소프트웨어가 이 동작을 가정하기 때문에 화면의 왼쪽 하단 모서리로 이동한다. |
| G | 135 | 87 | ESA | End of Selected Area |
| H | 136 | 88 | HTS | * Character Tabulation Set
* Horizontal Tabulation Set
 | 현재 위치에 탭 스톱을 설정한다. |
| I | 137 | 89 | HTJ | * Character Tabulation With Justification
* Horizontal Tabulation With Justification
 | 마지막 탭 이후의 텍스트를 다음 탭 스톱에 맞춰 오른쪽 정렬한다. |
| J | 138 | 8A | VTS | * Line Tabulation Set
* Vertical Tabulation Set
 | 세로 탭 스톱을 설정한다. |
| K | 139 | 8B | PLD | * Partial Line Forward
* Partial Line Down
 | ISO/IEC 6429에서 아래 첨자와 위 첨자를 생성하는 데 사용된다. 아래 첨자는 `PLD 텍스트 PLU`를 사용하고, 위 첨자는 `PLU 텍스트 PLD`를 사용한다. |
| L | 140 | 8C | PLU | * Partial Line Backward
* Partial Line Up
 |
| M | 141 | 8D | RI | * Reverse Line Feed
* Reverse Index
 | 한 줄 위로 이동한다. |
| N | 142 | 8E | SS2 | Single-Shift 2 | 다음 문자는 각각 G2 또는 G3 세트에서 가져온다. |
| O | 143 | 8F | SS3 | Single-Shift 3 |
| P | 144 | 90 | DCS | Device Control String | 인쇄 가능한 문자(0x20~0x7E)와 형식 효과 장치(0x08~0x0D) 문자열이 뒤따르며 ST(0x9C)로 종료된다. Xterm은 이들 중 다수를 정의했다. |
| Q | 145 | 91 | PU1 | Private Use 1 | 데이터 송신자와 수신자 간에 합의된 사설 기능을 위해 예약되어 있다. |
| R | 146 | 92 | PU2 | Private Use 2 |
| S | 147 | 93 | STS | Set Transmit State |  |
| T | 148 | 94 | CCH | 지움 문자 | 파괴적인 백스페이스로, BS의 의미에 대한 모호성을 제거한다. |
| U | 149 | 95 | MW | Message Waiting |  |
| V | 150 | 96 | SPA | Start of Protected Area | 블록 지향 터미널에서 사용된다. |
| W | 151 | 97 | EPA | End of Protected Area |
| X | 152 | 98 | SOS | Start of String | ST (0x9C)로 종료되는 제어 문자열이 뒤따른다. (DCS, OSC, PM, APC와 달리) SOS나 ST를 제외한 모든 문자를 포함할 수 있다. |
| Y | 153 | 99 | SGC, SGCI | Single Graphic Character Introducer | 임의의 유니코드 문자를 인쇄할 수 있도록 의도되었으며, 해당 문자가 뒤따른다. 대개 UTF-1으로 인코딩된다. |
| Z | 154 | 9A | SCI | Single Character Introducer | 단일 인쇄 가능 문자(0x20~0x7E)나 형식 효과 장치(0x08~0x0D)가 뒤따르며, 어떤 그래픽 또는 제어 세트가 사용 중이든 관계없이 ASCII로 인쇄한다. |
| [ | 155 | 9B | CSI | Control Sequence Introducer | 매개변수를 취하는 제어 시퀀스를 도입하는 데 사용된다. ANSI 이스케이프 코드에 사용된다. |
| \ | 156 | 9C | ST | String Terminator | DCS, SOS, OSC, PM, APC에 의해 시작된 문자열을 종료한다. |
| ] | 157 | 9D | OSC | Operating System Command | 인쇄 가능한 문자(0x20~0x7E)와 형식 효과 장치(0x08~0x0D) 문자열이 뒤따르며 ST(0x9C)로 종료된다. 프로토콜 정보의 인밴드 신호 전달을 위해 의도되었으나 그 용도로는 거의 사용되지 않는다.

Xterm을 포함한 일부 단말 에뮬레이터는 창 제목 설정 및 색상 팔레트 변경을 위해 OSC 시퀀스를 사용한다. ST 대신 BEL로 OSC 시퀀스를 종료하는 것도 지원할 수 있다. 커밋은 명령을 전송하기 위해 APC를 사용했다. |
| ^ | 158 | 9E | PM | Privacy Message |
| \_ | 159 | 9F | APC | Application Program Command |

## 기타 제어 코드 세트

ISO/IEC 2022 (ECMA-35) 확장 메커니즘을 통해 이스케이프 시퀀스로 C0 및 C1 세트를 변경할 수 있다. 위에 표시된 표준 C0 제어 문자 세트는 시퀀스 `ESC ! @`로 선택되며, 위의 C1 세트는 시퀀스 `ESC " C`로 선택된다.

여러 공식 및 비공식 대안이 정의되었으나 현재는 거의 폐기되었다. 대부분은 상호운용성을 위해 ASCII 제어 문자와 상당한 호환성을 유지해야 했다. 표준은 ESC, SP, DEL을 "고정" 코딩된 문자로 규정하며, 이는 표준을 준수하는 모든 인코딩의 ASCII 위치에서 사용할 수 있다. 또한 C0 세트에 전송 제어(TCn) 코드가 포함된 경우 ASCII 위치에 인코딩되어야 하며 C1 세트에 넣을 수 없음을 명시하고 있으며, 모든 새로운 전송 제어는 C1 세트에 있어야 한다.

### 대체 C0 문자 세트

* 뉴스 전송에 사용되는 텍스트 마크업 언어인 ANPA-1312는 여러 C0 제어 문자를 대체한다.
* 위의 최신 국제 버전인 IPTC 7901은 자체적인 변형을 가지고 있다.
* 비디오텍스는 완전히 다른 세트를 가지고 있다.
* 문자 다중 방송 또한 비디오텍스와 유사한 세트를 정의한다.
* T.61/T.51 등은 EM과 GS를 SS2와 SS3로 대체하여, 이 기능들을 이스케이프 시퀀스를 사용하지 않고도 7비트 환경에서 사용할 수 있도록 했다.
* 일부 세트는 FS를 SS2로 대체했다. (ANPA-1312와 동일).
* 현재 철회된 JIS C 6225 (나중에 JIS X 0207로 지정)는 FS를 세로 쓰기 동작, 위 첨자 및 아래 첨자, 그리고 사용자 정의 문자 그래픽 전송을 위한 제어 시퀀스를 도입하는 CEX 또는 "제어 확장"(Control Extension)으로 대체했다.

### 대체 C1 문자 세트

* MARC-8과 같이 문자열 데이터 정렬을 포함한 서지 용도로 등록된 전문 C1 제어 코드 세트가 있다.
* 비디오텍스 형식을 위해 등록된 다양한 전문 C1 제어 코드 세트가 있다.
* 스트라투스 VOS 운영 체제는 NLS 제어 세트라고 불리는 C1 세트를 사용한다. 여기에는 미리 정의된 보조 문자 세트에서 개별 문자를 호출하는 데 사용되는 SS1(Single-Shift 1)에서 SS15(Single-Shift 15) 제어 문자가 포함되어 있으며, 이는 ISO/IEC 2022의 싱글 시프트 메커니즘과 유사하다. ISO/IEC 2022에서 정의된 싱글 시프트 제어 문자는 SS2와 SS3뿐이며, VOS 세트에서도 이들은 원래 코드 포인트에 유지되어 동일하게 작동한다.
* EBCDIC은 ASCII에 있는 것 외에도 최대 29개의 추가 제어 코드를 정의한다. EBCDIC을 유니코드(또는 ISO 8859)로 번역할 때, 이 코드들은 IBM의 문자 데이터 표현 아키텍처(CDRA)에서 지정한 방식에 따라 C1 제어 문자로 매핑된다. 새줄 문자(NL)는 ISO/IEC 6429 NEL로 번역되지만(유닉스 줄 바꿈 관례에 따라 LF와 맞바뀌는 경우가 많음), 나머지 제어 코드들은 서로 대응되지 않는다. 예를 들어, EBCDIC 제어 문자 SPS와 ECMA-48 제어 문자 PLU는 모두 위 첨자를 시작하거나 아래 첨자를 끝내는 데 사용되지만 서로 매핑되지는 않는다. 따라서 확장 ASCII로 매핑된 EBCDIC은 ISO/IEC 2022용 ISO-IR 레지스트리에 등록되지는 않았으나 자체적인 C1 세트를 갖는 것으로 간주될 수 있다.

## 유니코드

유니코드는 C0 및 C1 제어 코드와의 호환성을 위해 위에서 설명한 65개의 코드 포인트를 예약하고, 이들에게 일반 범주 `Cc` (제어)를 부여한다. 이들은 다음과 같다.

* C0 제어 문자 및 로마자 기본 블록에 할당된 U+0000–U+001F (C0 제어 문자) 및 U+007F (DEL).
* C1 제어 문자 및 라틴-1 보충 블록에 할당된 U+0080–U+009F (C1 제어 문자).

유니코드는 C0 형식 제어 문자인 HT, LF, VT, FF, CR(BS는 누락됨), C0 정보 분리 문자인 FS, GS, RS, US(및 SP), 그리고 C1 제어 문자 NEL에 대해서만 의미를 지정한다. 나머지 코드들은 유니코드에서 투명하게 처리되며 그 의미는 상위 수준 프로토콜에 맡겨지는데, ISO/IEC 6429가 기본값으로 권장된다.

유니코드에는 이 외에도 명시적인 양방향 형식을 위한 표식, 임베딩, 격리, 팝, 합자 사용을 제어하기 위한 폭 없는 접합자 및 폭 없는 비접합자와 같은 많은 추가 형식 효과 문자가 포함되어 있다. 그러나 이들은 `Cc`가 아닌 `Cf` (형식) 일반 범주가 부여된다.

* 제어 문자 기호 - C0 제어 문자에 대한 유니코드 그래픽 표현 문자
* ANSI 이스케이프 코드

## 내용주

* 유니코드 표준
	+ C0 Controls and Basic Latin
	+ C1 Controls and Latin-1 Supplement
	+ Control Pictures
	+ The Unicode Standard, Version 6.1.0, Chapter 16: Special Areas and Format Characters
* ATIS Telecom Glossary 2007
* De litteris regentibus C1 quaestiones septem or Are C1 characters legal in XHTML 1.0?
* W3C I18N FAQ: HTML, XHTML, XML and Control Codes
* International register of coded character sets to be used with escape sequences 보관됨 2023-05-12 - 웨이백 머신