“不可打印字符”在此重定向。有关文本应用程序中的字符,请参阅字处理器中的非打印字符。
不要和转义字符相混淆
在计算和远程通信技术中,控制字符或非打印字符(NPC)是字符集中的一个代码点(一个数字),它不代表书写符号。它们用作带内信号,以产生除向文本添加符号之外的其他影响。所有其他字符主要是打印字符、可打印字符或图形字符,可能除了“空格”字符(请参阅ASCII可打印字符)。
代码32下面的ASCII表格中的所有项目(严格地说,是C0控制代码集)都属于这种类型,包括用于分隔文本行的CR和LF。代码127(DEL)也是控制字符[需要引用]。由ISO 8859定义的扩展ASCII集添加了代码128到159作为控制字符,这样做的主要目的是如果高位被剥离,它不会将打印字符改变为C0控制代码,但是这里有一些赋值,特别是NEL。第二个集合称为C1集合。
| [1] | 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 | HT | EM |
| 0x0A | LF | SUB |
| 0x0B | VT | ESC |
| 0x0C | FF | FS |
| 0x0D | CR | GS |
| 0x0E | SO | RS |
| 0x0F | SI | US |
| 0x7F | DEL |
这65个控制代码被带入Unicode。Unicode添加了更多可视为控件的字符,但它将这些“格式化字符”(如零宽度非连接符)与65个控制字符区分开来。
扩展的二进制编码十进制交换码(EBCDIC)字符集包含65个控制码,包括所有ASCII控制码以及主要用于控制IBM外围设备的附加码。
历史
莫尔斯电码中的程序符号是控制字符的一种形式。
1870年的波多码引入了一种形式的控制字符:NUL和DEL。1901年的波多码增加了回车符(CR)和换行符(LF),其他版本的波多码还包括其他控制字符。
铃声字符(BEL)也是早期的电传打字控制字符,它会敲响铃声来提醒操作员。
控制字符也被称为“格式效应器”。
在ASCII中
正文:C0和C1控制码
ASCII中仍然常用的控制字符包括:
- 0(NULL,NUL,\0,^@),最初是一个被忽略的字符,但现在包括C在内的许多编程语言都使用它来标记字符串的结尾。
- 7(BEL、BEL、\a、^G),这可能会导致设备发出警告,如铃声、嘟嘟声或屏幕闪烁。
- 8(backspace、BS、\b、^H),可能会叠印上一个字符。
- 9(horizontal tab,HT,\t,^i),将打印位置右移到下一个制表位。[tab也叫水瓶制表符]
- 10(line feed,LF,\n,^J),将打印头向下移动一行,或向左边缘并向下移动。在大多数UNIX系统和变体中用作行尾标记。
- 11(vertical tab,VT,\v,^K),垂直制表。
- 12(换页form feed,FF,\f,^L),使打印机将纸张弹出到下一页的顶部,或使视频终端清除屏幕。
- 13(carriage return,CR,\r,^M),将打印位置移动到行首,允许叠印。在Classic Mac OS、OS-9、FLEX(及其变体)中用作行尾标记。CP/M-80及其衍生产品(包括DOS和Windows)以及应用层协议(如FTP、SMTP和HTTP)使用CR+LF对。
- 26(Control-Z、SUB、EOF、^Z)。充当Windows文本模式文件I/O的文件结尾。
- 27(转义,Esc,\e(仅限GCC),^[)。引入转义序列。
可以将控制字符描述为在用户输入它们时执行某些操作,例如代码3(文本结束字符[End-of-Text character],ETX,^C)用于中断正在运行的进程,或代码4(传输结束字符[End-of-Transmission character],EOT,^D),用于结束文本输入或退出Unix shell。这些用法通常与它们在输出的文本中的用法没有多大关系,在现代系统上通常根本不涉及代码号的传输(相反,程序会得到这样的事实:用户按住Ctrl键并按下标有‘C’的键)。
定义了相当多的控制字符(ASCII中定义了33个,ECMA-48标准增加了32个)。这是因为早期的终端有非常原始的机械或电气控制,这使得任何类型的状态记忆API的实现都相当昂贵,因此每个功能的不同代码看起来都像是一种需求。解释代码序列来执行某项功能很快成为可能,而且成本也很低,设备制造商找到了发送数百条设备指令的方法。具体地说,他们使用了ASCII码27(转义),后跟一系列称为“控制序列”或“转义序列”的字符。这种机制是由ASCII之父鲍勃·贝默发明的。例如,代码27的序列,后跟可打印字符“[2;10H”,将导致DEC VT-102终端将其光标移动到屏幕第二行的第10个单元。这些序列有几个标准,特别是ANSI X3.64。但使用中的非标准变体的数量很多,特别是在打印机中,那里的技术进步速度远远快于任何标准机构可能跟得上的速度。
在Unicode中
正文:Unicode控制字符
在Unicode中,“控制字符”是U+0000-U+001F(C0控件)、U+007F(删除)和U+0080-U+009F(C1控件)。他们的一般类别是“抄送”(Cc)。格式化代码是不同的,属于一般类别“Cf”。Cc控制字符在Unicode中没有名称,而是指定了诸如“
显示
有许多显示非打印字符的技术,可以用ASCII编码的钟形字符(bell character)来说明:
- Code point:十进制7,十六进制0x07
- 缩写,通常是三个大写字母:BEL
- 缩写的特殊字符:UNICODE U+2407(␇),“graphic for bell”
- ISO2047图形表示法:UNICODE U+237E(⍾),“graphic for bell”
- ASCII格式的插入符号,其中代码点00xxxxx表示为插入符号,后跟代码点10xxxxx处的大写字母:^G
- 转义序列,如C/C++字符串代码:\a、\007、\x07等。
控制字符如何映射到键盘
基于ASCII的键盘有一个标记为“Control”、“Ctrl”或(很少)“CNTL”的键,它的用法很像Shift键,可以与另一个字母或符号键组合按下。在一种实现方式中,控制键在(通常)大写字母的代码下方64位处生成代码(即,从(通常)大写字母的十进制ASCII代码值中减去64)。另一种实现方式是将密钥产生的ASCII码与31进行逐位AND运算,强制第6位和第7位为零。例如,按下“CONTROL”和字母“g”或“G”(八进制的第107码或以10为基数的71,二进制为01000111),将生成代码7(贝尔,以10为基数的7,或以二进制表示的00000111)。空字符(代码0)由Ctrl-@表示,“@”是ASCII字符集中紧接在“A”之前的代码。为方便起见,许多终端接受Ctrl-Space作为Ctrl-@的别名。在任何一种情况下,这都会产生介于0和31之间的32个ASCII控制码中的一个。此方法不能表示Del字符,因为它的值(代码127),但Ctrl-?常用于此字符,如从‘?’中减去64给出−1,如果掩码为7位,则为127。
按住Ctrl键时,无论Shift键或Caps Lock键的状态如何,字母键都会产生相同的控制字符。换句话说,密钥产生的是大写字母还是小写字母并不重要。使用空格、图形字符和数字键(ASCII代码32至63)的控制键的解释因系统而异。有些会产生相同的字符代码,就好像没有按住Ctrl键一样。当按住控制键时,其他系统会将这些键转换为控制字符。使用非ASCII(“外来”)键的控制键的解释也因系统而异。
控制字符通常通过打印脱字符(^),然后打印值为控制字符加64的ASCII字符来呈现为称为脱字符表示法的可打印形式。因此,使用字母键生成的控制字符以字母的大写形式显示。例如,^G表示代码7,它是在按住Ctrl键时按G键生成的。
键盘通常还具有几个产生控制字符代码的单键。例如,标记为“Backspace”的键通常会产生代码8、“Tab”代码9、“Enter”或“Return”代码13(尽管有些键盘可能会产生代码10来表示“Enter”)。
