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, but they are rarely used.

C0 controls ASCII defines 32 control characters, plus the DEL character. 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. Many of the controls were designed for terminals to transmit large messages (such as news articles) from one to another, with no computer involved.

Only a few codes have maintained their use: BEL, ESC, and the format effector (FEn) characters BS, HT, LF, VT, FF, and CR. Others are unused or have acquired different meanings such as NUL being the C string terminator. Some data transfer protocols such as ANPA-1312, Kermit, and XMODEM do make extensive use of SOH, STX, ETX, EOT, ACK, NAK and SYN for purposes approximating their original definitions; and some file formats use the "Information Separators" (ISn) such as the Unix info format and Python's string method.

The names of some codes were changed in ISO 6429:1992 (or ECMA-48:1991) to be neutral with respect to writing direction. 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. In this table both new and old names are shown for the renamed controls (the old name is the one matching the abbreviation).

Unicode provides Control Pictures that can replace C0 control characters to make them visible on screen. However caret notation is used more often.

+ ASCII control codes, originally defined in ANSI X3.4. Abbreviations Name Description000NUL␀Null Does nothing. The code of blank paper tape, and also used for padding to slow transmission.101TC1, SOH␁Start of Heading First character of the heading of a message.202TC2, STX␂Start of Text Terminates the header and starts the message text.303TC3, ETX␃End of Text Ends the message text, starts a footer (up to the next TC character).404TC4, EOT␄End of Transmission Ends the transmission of one or more messages. May place terminals on standby.505␅Enquiry Trigger a response at the receiving end, to see if it is still present.606TC6, ACK␆Acknowledge Indication of successful receipt of a message.707BEL␇Bell, AlertCall for attention from an operator.808FE0, BS␈BackspaceMove one position leftwards. Next character may overprint or replace the character that was there.909FE1, HT, TAB␉Character Tabulation,Horizontal TabulationMove right to the next tab stop.100AFE2, LF␊Line FeedMove down to the same position on the next line (some devices also moved to the left column).110BFE3, VT␋Line Tabulation,Vertical TabulationMove down to the next vertical tab stop.120CFE4, FF, NP␌Form FeedMove down to the top of the next page.130DFE5, CR␍Carriage ReturnMove to column zero while staying on the same line.140ESO, LS1␎Shift OutSwitch to an alternative character set.150FSI, LS0␏Shift InReturn to regular character set after SO.1610␐Data Link Escape Cause a limited number of contiguously following characters to be interpreted in some different way.1711DC1, XON␑Device Control OneTurn on (DC1 and DC2) or off (DC3 and DC4) devices. Teletype used these for the paper tape reader and the paper tape punch. The first use became the de facto standard for software flow control.1812DC2, TAPE␒Device Control Two1913DC3, XOFF␓Device Control Three2014DC4, TAPE␔Device Control Four2115TC8, NAK␕Negative Acknowledge Negative response to a sender, such as a detected error.2216TC9, SYN␖Synchronous Idle Sent in synchronous serial communication when no other character is being transmitted.2317TC10, ETB␗ End of a transmission block of data when data are divided into such blocks for transmission purposes.2418CAN␘Cancel Indicates that the data preceding it are in error or are to be disregarded.2519EM ␙End of medium Indicates on paper or magnetic tapes that the end of the usable portion of the tape had been reached.261ASUB␚Substitute Replaces a character that was found to be invalid or in error. Should be ignored.271BESC␛Escape Alters the meaning of a limited number of following bytes.Nowadays this is almost always used to introduce an ANSI escape sequence.281CIS4, FS␜File Separator Can be used as delimiters to mark fields of data structures. US is the lowest level, while RS, GS, and FS are of increasing level to divide groups made up of items of the level beneath it. SP (space) could be considered an even lower level.291DIS3, GS␝Group Separator301EIS2, RS␞Record Separator311FIS1, US␟Unit SeparatorWhile not technically part of the C0 control character range, the following two characters could be thought of  3220SP␠Space On print terminals, this just moves right one character position, as "deleting" printed text was not an option. Display terminals treat this as a whitespace text character, thereby overwriting the existing character with the space character from the character table.1277FDEL␡Delete Used to delete characters on punched tape by punching out all the holes. In all other cases, it should be ignored.

C1 controls

In 1973, ECMA-35 and ISO 2022 attempted to define a method so an 8-bit "extended ASCII" code could be converted to a corresponding 7-bit code, and vice versa. In a 7-bit environment, the Shift Out () would change the meaning of the 96 bytes through (i.e. all but the C0 control codes), to be the characters that an 8-bit environment would print if it used the same code with the high bit set. This meant that the range through could not be printed in a 7-bit environment, thus it was decided that no alternative character set could use them, and that these codes should be additional control codes, which become known as the C1 control codes. To allow a 7-bit environment to use these new controls, the sequences ESC @ through ESC _ were to be considered equivalent. The later ISO 8859 standards abandoned support for 7-bit codes, but preserved this range of control characters.

The first C1 control code set to be registered for use with ISO 2022 was DIN 31626, a specialised set for bibliographic use which was registered in 1979.

The more common general-use ISO/IEC 6429 set was registered in 1983, although the ECMA-48 specification upon which it was based had been first published in 1976 and JIS X 0211 (formerly JIS C 6323). Symbolic names defined by and early drafts of ISO 10646, but not in ISO/IEC 6429 (, and ) are also used.

Except for and in EUC-JP text, and in text transcoded from EBCDIC, the 8-bit forms of these codes were almost never used. , and are used to control text terminals and terminal emulators, but almost always by using their 7-bit escape code representations. Nowadays if these codes are encountered it is far more likely they are intended to be printing characters from that position of Windows-1252 or Mac OS Roman.

Except for , Unicode does not provide a "control picture" for any of these. There is no well-known variation of Caret notation for them either.

+ ISO/IEC 6429 and RFC 1345 C1 control codes Abbr Name Description@12880PADPadding CharacterProposed as a "padding" or "high byte" for single-byte characters to make them two bytes long for easier interoperability with multiple byte characters. Extended Unix Code (EUC) occasionally uses this.A12981HOPHigh Octet PresetProposed to set the high byte of a sequence of multiple byte characters so they only need one byte each, as a simple form of data compression.B13082BPHBreak Permitted HereFollows a graphic character where a line break is permitted. Roughly equivalent to a soft hyphen or zero-width space except it does not define what is printed at the line break.C13183NBHNo Break HereFollows the graphic character that is not to be broken. See also word joiner.D13284INDIndexMove down one line without moving horizontally, to eliminate ambiguity about the meaning of LF.E13385NELNext LineEquivalent to CR+LF, to match the EBCDIC control character.F13486SSAStart of Selected AreaUsed by block-oriented terminals. In xterm moves to the lower-left corner of the screen, since certain software assumes this behaviour.G13587ESAEnd of Selected AreaH13688HTSSet a tab stop at the current position.I13789HTJRight-justify the text since the last tab against the next tab stop.J1388AVTSSet a vertical tab stop.K1398BPLD To produce subscripts and superscripts in ISO/IEC 6429.Subscripts use PLD text PLU while superscripts use PLU text PLD.L1408CPLUM1418DRIMove up one line.N1428ESS2Next character is from the G2 or G3 sets, respectively.O1438FSS3P14490DCSDevice Control StringFollowed by a string of printable characters (0x20 through 0x7E) and format effectors (0x08 through 0x0D), terminated by ST (0x9C). Xterm defined a number of these.Q14591PU1Private Use 1Reserved for private function agreed on between the sender and the recipient of the data.R14692PU2Private Use 2S14793STSSet Transmit StateT14894CCHCancel characterDestructive backspace, to eliminate ambiguity about meaning of .U14995MWMessage WaitingV15096SPAStart of Protected AreaUsed by block-oriented terminals.W15197EPAEnd of Protected AreaX15298SOSStart of StringFollowed by a control string terminated by (0x9C) which (unlike , , or ) may contain any character except SOS or ST.Y15399SGC, SGCISingle Graphic Character IntroducerIntended to allow an arbitrary Unicode character to be printed; it would be followed by 4 bytes to define a 32-bit code point, most likely big-endian.Z1549ASCISingle Character IntroducerTo be followed by a single printable character (0x20 through 0x7E) or format effector (0x08 through 0x0D), and to print it as ASCII no matter what graphic or control sets were in use.[1559BCSIControl Sequence IntroducerUsed to introduce control sequences that take parameters. Used for ANSI escape sequences.\1569CSTString TerminatorTerminates a string started by , , , or . ]1579DOSCOperating System CommandFollowed by a string of printable characters (0x20 through 0x7E) and format effectors (0x08 through 0x0D), terminated by ST (0x9C), intended for use to allow in-band signaling of protocol information, but rarely used for that purpose.

Some terminal emulators, including xterm, use OSC sequences for setting the window title and changing the colour palette. They may also support terminating an OSC sequence with instead of ST. Kermit used APC to transmit commands. Kitty uses APC to render graphics using the Kitty Graphics Protocol.^1589EPMPrivacy Message_1599FAPCApplication Program Command

Other control code sets

The ISO/IEC 2022 (ECMA-35) extension mechanism allowed escape sequences to change the C0 and C1 sets. The standard C0 control character set shown above is chosen with the sequence and the above C1 set chosen with the sequence .

Several official and unofficial alternatives have been defined, but this is pretty much obsolete. Most were forced to retain a good deal of compatibility with the ASCII controls for interoperability. The standard makes ESC, SP and DEL "fixed" coded characters, which are available in their ASCII locations in all encodings that conform to the standard. It also specifies that if a C0 set included transmission control (TCn) codes, they must be encoded at their ASCII locations and could not be put in a C1 set, and any new transmission controls must be in a C1 set.