“不可打印字符”在此重定向。有关文本应用程序中的字符,请参阅字处理器中的非打印字符
不要和转义字符相混淆

在计算和远程通信技术中,控制字符或非打印字符(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”)。