C0 and C1 control codes

The C0 and C1 control code or control character sets define control codes for use in text by computer systems that use ASCII and derivatives of ASCII. The codes represent additional information about the text, such as the position of a cursor, an instruction to start a new line, or a message that the text has been received.

C0 codes are the range 00HEX–1FHEX and the default C0 set was originally defined in ISO 646 (ASCII). C1 codes are the range 80HEX–9FHEX and the default C1 set was originally defined in ECMA-48 (harmonized later with ISO 6429). The ISO/IEC 2022 system of specifying control and graphic characters allows other C0 and C1 sets to be available for specialized applications, they are rarely used.

C0 controls[edit]

ASCII defined 32 control characters, plus a necessary extra one for the all-1 DEL character (needed to punch out all the holes on a paper tape and erase it).

This large number of codes was desirable at the time, as multi-byte controls would require implementation of a state machine in the terminal, which was very difficult with contemporary electronics and mechanical terminals. Since then, only a few of the original controls have maintained their use: the "whitespace" range of BS, TAB, LF, VT, FF, and CR; the BEL code; and ESC (but, except in ISO-2022-JP, almost always as part of an ESC,'[' CSI representation starting an ANSI escape sequence). Others are unused or have acquired different meanings such as NUL being the C string terminator.

Some serial transmission protocols such as ANPA-1312, Kermit, and XMODEM do make extensive use of control characters SOH, STX, ETX, EOT, ACK, NAK and SYN for purposes approximating their original definitions.

These are the standard ASCII control codes, originally defined in ANSI X3.4. If using the ISO/IEC 2022 extension mechanism, they are designated as the active C0 control character set with the octet sequence 0x1B 0x21 0x40 (ESC ! @).

Seq Dec Hex Acronym Symbol Name C Description
^@ 00 00 NUL Null \0 Originally used to allow gaps to be left on paper tape for edits. Later used for padding after a code that might take a terminal some time to process (e.g. a carriage return or line feed on a printing terminal). Now often used as a string terminator, especially in the programming language C.
^A 01 01 SOH Start of Heading First character of a message header. In Hadoop, it is often used as a field separator.
^B 02 02 STX Start of Text First character of message text, and may be used to terminate the message heading.
^C 03 03 ETX End of Text Often used as a "break" character (Ctrl-C) to interrupt or terminate a program or process.
^D 04 04 EOT End of Transmission Often used on Unix to indicate end-of-file on a terminal.
^E 05 05 ENQ Enquiry Signal intended to trigger a response at the receiving end, to see if it is still present.
^F 06 06 ACK Acknowledge Response to an ENQ, or an indication of successful receipt of a message.
^G 07 07 BEL[a] Bell, Alert \a Originally used to sound a bell on the terminal. Later used for a beep on systems that didn't have a physical bell. May also quickly turn on and off inverse video (a visual bell).
^H 08 08 BS Backspace \b Move the cursor one position leftwards. On input, this may delete the character to the left of the cursor. On output, where in early computer technology a character once printed could not be erased, the backspace was sometimes used to generate accented characters in ASCII. For example, à could be produced using the three character sequence a BS ` (or, using the characters’ hex values, 0x61 0x08 0x60). This usage is now generally not supported (it is prohibited in, for instance, ISO/IEC 8859).[6] To provide disambiguation between the two potential uses of backspace, the cancel character control code was made part of the standard C1 control set.
^I 09 09 HT Character Tabulation, Horizontal Tabulation \t Position to the next character tab stop.
^J 10 0A LF Line Feed \n On typewriters, printers, and some terminal emulators, moves the cursor down one row without affecting its column position. On Unix, used to mark end-of-line. In DOS, Windows, and various network standards, LF is used following CR as part of the end-of-line mark.
^K 11 0B VT Line Tabulation, Vertical Tabulation \v Position the form at the next line tab stop.
^L 12 0C FF Form Feed \f On printers, load the next page. Treated as whitespace in many programming languages, and may be used to separate logical divisions in code. In some terminal emulators, it clears the screen. It still appears in some common plain text files as a page break character, such as the RFCs published by IETF.
^M 13 0D CR Carriage Return \r Originally used to move the cursor to column zero while staying on the same line. On classic Mac OS (pre-Mac OS X), as well as in earlier systems such as the Apple II and Commodore 64, used to mark end-of-line. In DOS, Windows, and various network standards, it is used preceding LF as part of the end-of-line mark. The Enter or Return key on a keyboard will send this character, but it may be converted to a different end-of-line sequence by a terminal program.
^N 14 0E SO Shift Out Switch to an alternative character set.
^O 15 0F SI Shift In Return to regular character set after Shift Out.
^P 16 10 DLE Data Link Escape Cause the following octets to be interpreted as raw data, not as control codes or graphic characters. Returning to normal usage would be implementation dependent.

^Q 17 11 DC1 Device Control One (XON) These four control codes are reserved for device control, with the interpretation dependent upon the device to which they were connected. DC1 and DC2 were intended primarily to indicate activating a device while DC3 and DC4 were intended primarily to indicate pausing or turning off a device. DC1 and DC3 (known also as XON and XOFF respectively in this usage) originated as the "start and stop remote paper-tape-reader" functions in ASCII Telex networks. This teleprinter usage became the de facto standard for software flow control.[7]
^R 18 12 DC2 Device Control Two
^S 19 13 DC3 Device Control Three (XOFF)
^T 20 14 DC4 Device Control Four
^U 21 15 NAK Negative Acknowledge Sent by a station as a negative response to the station with which the connection has been set up. In binary synchronous communication protocol, the NAK is used to indicate that an error was detected in the previously received block and that the receiver is ready to accept retransmission of that block. In multipoint systems, the NAK is used as the not-ready reply to a poll.
^V 22 16 SYN Synchronous Idle Used in synchronous transmission systems to provide a signal from which synchronous correction may be achieved between data terminal equipment, particularly when no other character is being transmitted.
^W 23 17 ETB End of Transmission Block Indicates the end of a transmission block of data when data are divided into such blocks for transmission purposes.
^X 24 18 CAN Cancel Indicates that the data preceding it are in error or are to be disregarded.
^Y 25 19 EM End of medium Intended as means of indicating on paper or magnetic tapes that the end of the usable portion of the tape had been reached.
^Z 26 1A SUB Substitute Originally intended for use as a transmission control character to indicate that garbled or invalid characters had been received. It has often been put to use for other purposes when the in-band signaling of errors it provides is unneeded, especially where robust methods of error detection and correction are used, or where errors are expected to be rare enough to make using the character for other purposes advisable. In DOS, Windows and other CP/M derivatives, it is used to indicate the end of file, both when typing on the terminal, and sometimes in text files stored on disk.
^[ 27 1B ESC Escape \e[b] The Esc key on the keyboard will cause this character to be sent on most systems. It can be used in software user interfaces to exit from a screen, menu, or mode, or in device-control protocols (e.g., printers and terminals) to signal that what follows is a special command sequence rather than normal text. In systems based on ISO/IEC 2022, even if another set of C0 control codes are used, this octet is required to always represent the escape character.

^\ 28 1C FS File Separator Can be used as delimiters to mark fields of data structures. If used for hierarchical levels, US is the lowest level (dividing plain-text data items), while RS, GS, and FS are of increasing level to divide groups made up of items of the level beneath it.
^] 29 1D GS Group Separator
^^ 30 1E RS Record Separator
^_ 31 1F US Unit Separator
While not technically part of the C0 control character range, the following two characters are defined in ISO/IEC 2022 as always being available regardless of which sets of control characters and graphics characters have been registered. They can be thought of as having some characteristics of control characters.
  32 20 SP Space Space is a graphic character. It has a visual representation consisting of the absence of a graphic symbol. It causes the active position to be advanced by one character position. In some applications, Space can be considered a lowest-level "word separator" to be used with the adjacent separator characters.
^? 127 7F DEL Delete Not technically part of the C0 control character range, this was originally used to mark deleted characters on paper tape, since any character could be changed to all ones by punching holes everywhere. On VT100 compatible terminals, this is the character generated by the key labelled ⌫, usually called backspace on modern machines, and does not correspond to the PC delete key.

C1 controls[edit]

At the time the 8-bit ISO/IEC 8859 ASCII extensions were being designed it was considered important that stripping the top bit would not turn a printing character into a control (apparently DEL was considered harmless). Therefore these standards reserved the same 32 codes as the C0 set but with the high bit set for additional "C1" controls. Many of these were assigned meanings, mostly as new pairs of controls to replace C0 controls whose meaning had become ambiguous. In reality this "hole" in the printing characters probably caused more problems than it solved.

The standard also specified that all the C1 controls had a 7 bit equivalent consisting of ESC followed by a letter so that they could be achieved with 7 bit communication.

Except for NEL these are almost never used (CSI is often used, but almost always by using the ESC,'[' 7-bit replacement). The C1 codes require two bytes to be encoded in UTF-8 (for instance CSI at U+009B is encoded as the bytes 0xC2, 0x9B in UTF-8), so there is no advantage to using them rather than the equivalent two-byte ESC+letter sequence, and when these codes turn up in modern documents, web pages, e-mail messages, etc., they are usually intended to be printing characters at that position in a proprietary encoding such as Windows-1252 or Mac OS Roman that use the C1 codes to provide additional graphic characters.

The official English language names of some C1 codes were revised in the most recent edition of the standard for control codes in general (ISO 6429:1992 or ECMA-48:1991) to be neutral with respect to the graphic characters used with them, and to not assume that, as in the Latin script, lines are written on a page from top to bottom and that characters are written on a line from left to right. The abbreviations used were not changed, as the standard had already specified that those would remain unchanged when the standard is translated to other languages. Where the name has been changed, the original name from which the abbreviation was derived is also given in parenthesis in the tables below.

These are the most common extended control codes. If using the ISO/IEC 2022 extension mechanism, they are designated as the active C1 control character set with the sequence 0x1B 0x22 0x43 (ESC " C). Individual control functions can be accessed with the 7-bit equivalents 0x1B 0x40 through 0x1B 0x5F (ESC @ through ESC _).

Esc+ Dec Hex Acro Name Description
@ 128 80 PAD Padding Character Not part of ISO/IEC 6429 (ECMA-48). In early drafts of ISO 10646, was used as part of a proposed mechanism to encode non-ASCII characters. This use was removed in later drafts.[2][8] Is nonetheless used by the internal-use two-byte fixed-length form of the ISO-2022-based Extended Unix Code (EUC) for left-padding single byte characters in code sets 1 and 3, whereas NUL serves the same function for code sets 0 and 2. This is not done in the usual "packed" EUC format.[9]
A 129 81 HOP High Octet Preset Not part of ISO/IEC 6429 (ECMA-48). In early drafts of ISO 10646, was intended as a means of introducing a sequence of ISO 2022 compliant multiple byte characters with the same first byte without repeating said first byte, thus reducing length; this behaviour was never part of a standard or published implementation. Its name was nonetheless retained as a RFC 1345 standard code-point name.[2][8]
B 130 82 BPH Break Permitted Here Follows a graphic character where a line break is permitted. Roughly equivalent to a soft hyphen except that the means for indicating a line break is not necessarily a hyphen. Not part of the first edition of ISO/IEC 6429.[10] See also zero-width space.
C 131 83 NBH No Break Here Follows the graphic character that is not to be broken. Not part of the first edition of ISO/IEC 6429.[10] See also word joiner.
D 132 84 IND Index Move the active position one line down, to eliminate ambiguity about the meaning of LF. Deprecated in 1988 and withdrawn in 1992 from ISO/IEC 6429 (1986 and 1991 respectively for ECMA-48).
E 133 85 NEL Next Line Equivalent to CR+LF. Used to mark end-of-line on some IBM mainframes.
F 134 86 SSA Start of Selected Area Used by block-oriented terminals.
G 135 87 ESA End of Selected Area
H 136 88 HTS Character Tabulation Set
Horizontal Tabulation Set
Causes a character tabulation stop to be set at the active position.
I 137 89 HTJ Character Tabulation With Justification
Horizontal Tabulation With Justification
Similar to Character Tabulation, except that instead of spaces or lines being placed after the preceding characters until the next tab stop is reached, the spaces or lines are placed preceding the active field so that preceding graphic character is placed just before the next tab stop.
J 138 8A VTS Line Tabulation Set
Vertical Tabulation Set
Causes a line tabulation stop to be set at the active position.
K 139 8B PLD Partial Line Forward
Partial Line Down
Used to produce subscripts and superscripts in ISO/IEC 6429, e.g., in a printer.
Subscripts use PLD text PLU while superscripts use PLU text 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 Next character invokes a graphic character from the G2 or G3 graphic sets respectively. In systems that conform to ISO/IEC 4873 (ECMA-43), even if a C1 set other than the default is used, these two octets may only be used for this purpose.
O 143 8F SS3 Single-Shift 3
P 144 90 DCS Device Control String Followed by a string of printable characters (0x20 through 0x7E) and format effectors (0x08 through 0x0D), terminated by ST (0x9C).
Q 145 91 PU1 Private Use 1 Reserved for a function without standardized meaning for private use as required, subject to the prior agreement of the sender and the recipient of the data.
R 146 92 PU2 Private Use 2
S 147 93 STS Set Transmit State
T 148 94 CCH Cancel character Destructive backspace, intended to eliminate ambiguity about meaning of BS.
U 149 95 MW Message Waiting
V 150 96 SPA Start of Protected Area Used by block-oriented terminals.
W 151 97 EPA End of Protected Area
X 152 98 SOS Start of String Followed by a control string terminated by ST (0x9C) that may contain any character except SOS or ST. Not part of the first edition of ISO/IEC 6429.[10]
Y 153 99 SGCI Single Graphic Character Introducer Not part of ISO/IEC 6429. In early drafts of ISO 10646, was used to encode a single multiple-byte character without switching out of a HOP mode. In later drafts, this facility was removed, the name was nonetheless retained as a RFC 1345 standard code-point name.[2][8]
Z 154 9A SCI Single Character Introducer To be followed by a single printable character (0x20 through 0x7E) or format effector (0x08 through 0x0D). The intent was to provide a means by which a control function or a graphic character that would be available regardless of which graphic or control sets were in use could be defined. Definitions of what the following byte would invoke was never implemented in an international standard. Not part of the first edition of ISO/IEC 6429.[10]
[ 155 9B CSI Control Sequence Introducer Used to introduce control sequences that take parameters.
\ 156 9C ST String Terminator
] 157 9D OSC Operating System Command Followed by a string of printable characters (0x20 through 0x7E) and format effectors (0x08 through 0x0D), terminated by ST (0x9C). These three control codes were intended for use to allow in-band signaling of protocol information, but are rarely used for that purpose.

Some terminal emulators, including xterm, support OSC sequences for setting the window title and reconfiguring the available colour palette.[11]

^ 158 9E PM Privacy Message
_ 159 9F APC Application Program Command


Unicode sets aside 65 code points in the general category "Cc" (Control) for compatibility with ISO/IEC 2022. The Unicode control characters cover U+0000—U+001F (C0 controls), U+007F (delete), and U+0080—U+009F (C1 controls). Unicode only specifies semantics for U+001C—U+001F, U+0009—U+000D, and U+0085. The rest of the control characters are transparent to Unicode and their meanings are left to higher-level protocols.

Unicode has no category "Cc" code points allocated other than the C0 and C1 ones. However, it does include additional format effector characters besides those in the C0 and C1 control sets, such as marks, embeds, isolates and pops for explicit bidirectional formatting, and the zero-width joiner and non-joiner for controlling ligature use. These are given the general category "Cf" (Format) rather than "Cc".

See also[edit]


  1. ^ The name BELL is assigned by Unicode to the unrelated emoji character 🔔 (U+1F514). While C0 and C1 control characters were not formally named by the Unicode standard itself at the time, this collided with existing use of BELL as the name of this control character in software following the previous versions of UTS#18 (the Unicode Regular Expressions standard),[1] e.g. in Perl.[2] Unicode now accepts ALERT and BEL (but not BELL) as formal aliases for the control character,[3] although the code chart still lists BELL as the ISO 6429 alias,[4] and the corresponding control picture code point is called SYMBOL FOR BELL. Perl subsequently switched to using BELL for the emoji in version 5.18.[5]
  2. ^ The '\e' escape sequence is not part of ISO C and many other language specifications. However, it is understood by several compilers, including GCC.


  1. ^ Williamson, Karl. "Re: PRI #202: Extensions to NameAliases.txt for Unicode 6.1.0".
  2. ^ a b c d Ken Whistler (July 20, 2011). "Formal Name Aliases for Control Characters, L2/11-281". Unicode Consortium.
  3. ^ "Name Aliases". Unicode Consortium.
  4. ^ "C0 Controls and Basic Latin" (PDF). Unicode Consortium.
  5. ^ "charnames". Perl Programming Documentation.
  6. ^ ISO/IEC JTC 1/SC 2 (1998-02-12). Final Text of DIS 8859-10, Information Technology — 8-bit single-byte coded graphic character sets — Part 10: Latin alphabet No. 6 (PDF). ISO/IEC FDIS 8859-10:1998, JTC1/SC2 N2992, WG3 N415.
  7. ^ "What is the point of Ctrl-S?". Unix and Linux Stack exchange. Retrieved 14 February 2019.
  8. ^ a b c Ken Whistler (2015-10-05). "Why Nothing Ever Goes Away". Unicode Mailing List.
  9. ^ Lunde, Ken (2008). CJKV Information Processing: Chinese, Japanese, Korean, and Vietnamese Computing. O'Reilly. p. 244. ISBN 9780596800925.
  10. ^ a b c d "C1 Control Set of ISO 6429:1983, International Register of Coded Character Sets, Registration Number 77" (PDF). Archived from the original (PDF) on 2014-07-01.
  11. ^ Moy, Edward; Gildea, Stephen; Dickey, Thomas. "Operating System Commands". XTerm Control Sequences.