Control character
In computing and telecommunication, a control character or non-printing character is a code point in a character set, that does not represent a written symbol. They are used as in-band signaling to cause effects other than the addition of a symbol to the text. All other characters are mainly printing, printable, or graphic characters, except perhaps for the "space" character.
All entries in the ASCII table below code 32 are of this kind, including CR and LF used to separate lines of text. The code 127 is also a control character. Extended ASCII sets defined by ISO 8859 added the codes 128 through 159 as control characters, this was primarily done so that if the high bit was stripped it would not change a printing character to a C0 control code, but there have been some assignments here, in particular NEL. This second set is called the C1 set.
These 65 control codes were carried over to Unicode. Unicode added more characters that could be considered controls, but it makes a distinction between these "Formatting characters", and the 65 Control characters.
The Extended Binary Coded Decimal Interchange Code character set contains 65 control codes, including all of the ASCII control codes as well as additional codes which are mostly used to control IBM peripherals.
0x00 | 0x10 | |
0x00 | NUL | DLE |
0x01 | SOH | DC1 |
0x02 | STX | DC2 |
0x03 | ETX | DC3 |
0x04 | EOT | DC4 |
0x05 | ENQ | NAK |
0x06 | ACK | SYN |
0x07 | BEL | ETB |
0x08 | BS | CAN |
0x09 | TAB | EM |
0x0A | LF | SUB |
0x0B | VT | ESC |
0x0C | FF | FS |
0x0D | CR | GS |
0x0E | SO | RS |
0x0F | SI | US |
0x7F | DEL |
History
in Morse code are a form of control character.A form of control characters were introduced in the 1870 Baudot code: NUL and DEL.
The 1901 Murray code added the carriage return and line feed, and other versions of the Baudot code included other control characters.
The bell character, which rang a bell to alert operators, was also an early teletype control character.
Control characters have also been called "format effectors".
In ASCII
The control characters in ASCII still in common use include:- 0, originally intended to be an ignored character, but now used by many programming languages including C to mark the end of a string.
- 7, which may cause the device to emit a warning such as a bell or beep sound or the screen flashing.
- 8, may overprint the previous character.
- 9, moves the printing position right to the next tab stop.
- 10, moves the print head down one line, or to the left edge and down. Used as the end of line marker in most UNIX systems and variants.
- 11, vertical tabulation.
- 12, to cause a printer to eject paper to the top of the next page, or a video terminal to clear the screen.
- 13, moves the printing position to the start of the line, allowing overprinting. Used as the end of line marker in Classic Mac OS, OS-9, FLEX. A
CR+LF
pair is used by CP/M-80 and its derivatives including DOS and Windows, and by Application Layer protocols such as FTP, SMTP, and HTTP. - 26. Acts as an end-of-file for the Windows text-mode file i/o.
- 27. Introduces an escape sequence.
There were quite a few control characters defined. This was because early terminals had very primitive mechanical or electrical controls that made any kind of state-remembering API quite expensive to implement, thus a different code for each and every function looked like a requirement. It quickly became possible and inexpensive to interpret sequences of codes to perform a function, and device makers found a way to send hundreds of device instructions. Specifically, they used ASCII code 27, followed by a series of characters called a "control sequence" or "escape sequence". The mechanism was invented by Bob Bemer, the father of ASCII. For example, the sequence of code 27, followed by the printable characters
In Unicode
In Unicode, "Control-characters" are U+0000—U+001F, U+007F, and U+0080—U+009F. Their General Category is "Cc". Formatting codes are distinct, in General Category "Cf". The Cc control characters have no Name in Unicode, but are given labels such as "Display
There are a number of techniques to display non-printing characters, which may be illustrated with the bell character in ASCII encoding:- Code point: decimal 7, hexadecimal 0x07
- An abbreviation, often three capital letters: BEL
- A special character condensing the abbreviation: Unicode U+2407, "symbol for bell"
- An [ISO 2047">VT100">DEC VT-102 terminal to move its cursor to the 10th cell of the 2nd line of the screen. Several standards exist for these sequences, notably ANSI X3.64. But the number of non-standard variations in use is large, especially among printers, where technology has advanced far faster than any standards body can possibly keep up with.
In Unicode
In Unicode, "Control-characters" are U+0000—U+001F, U+007F, and U+0080—U+009F. Their General Category is "Cc". Formatting codes are distinct, in General Category "Cf". The Cc control characters have no Name in Unicode, but are given labels such as "" instead. Display
There are a number of techniques to display non-printing characters, which may be illustrated with the bell character in ASCII encoding:- Code point: decimal 7, hexadecimal 0x07
- An abbreviation, often three capital letters: BEL
- A special character condensing the abbreviation: Unicode U+2407, "symbol for bell"
- An [ISO 2047 graphical representation: Unicode U+237E, "graphic for bell"
- Caret notation in ASCII, where code point 00xxxxx is represented as a caret followed by the capital letter at code point 10xxxxx: ^G
- An escape sequence, as in C/C++ character string codes: \a, \007, \x07, etc.
How control characters map to keyboards
When the control key is held down, letter keys produce the same control characters regardless of the state of the shift or caps lock keys. In other words, it does not matter whether the key would have produced an upper-case or a lower-case letter. The interpretation of the control key with the space, graphics character, and digit keys vary between systems. Some will produce the same character code as if the control key were not held down. Other systems translate these keys into control characters when the control key is held down. The interpretation of the control key with non-ASCII keys also varies between systems.
Control characters are often rendered into a printable form known as caret notation by printing a caret and then the ASCII character that has a value of the control character plus 64. Control characters generated using letter keys are thus displayed with the upper-case form of the letter. For example, ^G represents code 7, which is generated by pressing the G key when the control key is held down.
Keyboards also typically have a few single keys which produce control character codes. For example, the key labelled "Backspace" typically produces code 8, "Tab" code 9, "Enter" or "Return" code 13.
Many keyboards include keys that do not correspond to any ASCII printable or control character, for example cursor control arrows and word processing functions. The associated keypresses are communicated to computer programs by one of four methods: appropriating otherwise unused control characters; using some encoding other than ASCII; using multi-character control sequences; or using an additional mechanism outside of generating characters. "Dumb" computer terminals typically use control sequences. Keyboards attached to stand-alone personal computers made in the 1980s typically use one of the first two methods. Modern computer keyboards generate scancodes that identify the specific physical keys that are pressed; computer software then determines how to handle the keys that are pressed, including any of the four methods described above.The design purpose
The control characters were designed to fall into a few groups: printing and display control, data structuring, transmission control, and miscellaneous.Printing and display control
Printing control characters were first used to control the physical mechanism of printers, the earliest output device. An early implementation of this idea was the out-of-band ASA carriage control characters. Later, control characters were integrated into the stream of data to be printed.
The carriage return character, when sent to such a device, causes it to put the character at the edge of the paper at which writing begins.
The line feed character causes the device to put the printing position on the next line. It may, depending on the device and its configuration, also move the printing position to the start of the next line.
The vertical and horizontal tab characters cause the output device to move the printing position to the next tab stop in the direction of reading.
The form feed character starts a new sheet of paper, and may or may not move to the start of the first line.
The backspace character moves the printing position one character space backwards. On printers, this is most often used so the printer can overprint characters to make other, not normally available, characters. On terminals and other electronic output devices, there are often software configuration choices which will allow a destruct backspace which erases, or a non-destructive one which does not.
The shift in and shift out characters selected alternate character sets, fonts, underlining or other printing modes. Escape sequences were often used to do the same thing.
With the advent of computer terminals that did not physically print on paper and so offered more flexibility regarding screen placement, erasure, and so forth, printing control codes were adapted. Form feeds, for example, usually cleared the screen, there being no new paper page to move to. More complex escape sequences were developed to take advantage of the flexibility of the new terminals, and indeed of newer printers. The concept of a control character had always been somewhat limiting, and was extremely so when used with new, much more flexible, hardware. Control sequences could match the new flexibility and power and became the standard method. However, there were, and remain, a large variety of standard sequences to choose from.Data structuring
The separators were made to structure data, usually on a tape, in order to simulate punched cards.
End of medium warns that the tape is ending.
While many systems use CR/LF and TAB for structuring data, it is possible to encounter the separator control characters in data that needs to be structured. The separator control characters are not overloaded; there is no general use of them except to separate data into structured groupings. Their numeric values are contiguous with the space character, which can be considered a member of the group, as a word separator.Transmission control
The transmission control characters were intended to structure a data stream, and to manage re-transmission or graceful failure, as needed, in the face of transmission errors.
The start of heading character was to mark a non-data section of a data stream—the part of a stream containing addresses and other housekeeping data. The start of text character marked the end of the header, and the start of the textual part of a stream. The end of text character marked the end of the data of a message. A widely used convention is to make the two characters preceding ETX a checksum or CRC for error-detection purposes. The end of transmission block character was used to indicate the end of a block of data, where data was divided into such blocks for transmission purposes.
The escape character was intended to "quote" the next character, if it was another control character it would print it instead of performing the control function. It is almost never used for this purpose today.
The substitute character was intended to request a translation of the next character from a printable character to another value, usually by setting bit 5 to zero. This is handy because some media can transmit only printable characters. However, on MS-DOS systems with files opened in text mode, "end of text" or "end of file" is marked by this Ctrl-Z character, instead of the Ctrl-C or Ctrl-D, which are common on other operating systems.
The cancel character signalled that the previous element should be discarded. The negative acknowledge character is a definite flag for, usually, noting that reception was a problem, and, often, that the current element should be sent again. The acknowledge character is normally used as a flag to indicate no problem detected with current element.
When a transmission medium is half duplex, there is usually a master station that can transmit at any time, and one or more slave stations that transmit when they have permission. The enquire character is generally used by a master station to ask a slave station to send its next message. A slave station indicates that it has completed its transmission by sending the end of transmission character.
The device control codes were originally generic, to be implemented as necessary by each device. However, a universal need in data transmission is to request the sender to stop transmitting when a receiver is temporarily unable to accept any more data. Digital Equipment Corporation invented a convention which used 19 to "S"top transmission, and 17 to start transmission. It has become so widely used that most don't realize it is not part of official ASCII. This technique, however implemented, avoids additional wires in the data cable devoted only to transmission management, which saves money. A sensible protocol for the use of such transmission flow control signals must be used, to avoid potential deadlock conditions, however.
The data link escape character was intended to be a signal to the other end of a data link that the following character is a control character such as STX or ETX. For example a packet may be structured in the following way. Miscellaneous codes
Code 7 is intended to cause an audible signal in the receiving terminal.
Many of the ASCII control characters were designed for devices of the time that are not often seen today. For example, code 22, "synchronous idle", was originally sent by synchronous modems when there was no actual data to send.
Code 0 is a special case. In paper tape, it is the case when there are no holes. It is convenient to treat this as a fill character with no meaning otherwise. Since the position of a NUL character has no holes punched, it can be replaced with any other character at a later time, so it was typically used to reserve space, either for correcting errors or for inserting information that would be available at a later time or in another place. In computing it is often used for padding in fixed length records and more commonly, to mark the end of a string.
Code 127 is likewise a special case. Its 7-bit code is all-bits-on in binary, which essentially erased a character cell on a paper tape when overpunched. Paper tape was a common storage medium when ASCII was developed, with a computing history dating back to WWII code breaking equipment at Biuro Szyfrów. Paper tape became obsolete in the 1970s, so this clever aspect of ASCII rarely saw any use after that. Some systems converted it to a backspace. But because its code is in the range occupied by other printable characters, and because it had no official assigned glyph, many computer equipment vendors used it as an additional printable character.
Non-erasable Programmable ROMs are typically implemented as arrays of fusible elements, each representing a bit, which can only be switched one way, usually from one to zero. In such PROMs, the DEL and NUL characters can be used in the same way that they were used on punched tape: one to reserve meaningless fill bytes that can be written later, and the other to convert written bytes to meaningless fill bytes. For PROMs that switch one to zero, the roles of NUL and DEL are reversed; also, DEL will only work with 7-bit characters, which are rarely used today; for 8-bit content, the character code 255, commonly defined as a nonbreaking space character, can be used instead of DEL.
Many file systems do not allow control characters in the filenames, as they may have reserved functions.