控制字符

控制字符,是出现在特定的信息文本中,表示某一控制功能的字符。

在计算中,一个控制字符非打印字符,是一个码位(一个数字)是否在字符集,其自身也是书写字母来描述的。所有输出在32以下的ASCII表都是这个类型,包括

  • BEL(要求有声信号来响应终端的接收)
  • SYN(同步信号)
  • ENQ(要求接收后发出响应来验证存在)
  • Unicode标准增加了许多新的非打印字符,比如零宽不连字。

在ASCII中

在ASCII中常用的控制字符包括

  • 7(bell响铃),用来使收到该字符的设备发出某种警告
  • 8(backspace退格),用来删除或者叠打上一个被打印的字符
  • 9(horizontal tab水平制表)
  • 10(line feed馈行),在大多数UNIX系统和变异系统中用来结束行
  • 12(form feed馈页),用来使打印机馈出一页
  • 13(carriage return歸位),在Mac OSOS-9、FLEX和CP/M-80派生的系统中,包括DOS,用于结束文本行
  • 27(escape转义)

人们有时会遇到其他代码的现代用法,如用编码4(传输结束)结束Unix shell会话或PostScript打印机的传输。

编码27(转义)值得详细描述。尽管很多控制字符是从不使用的,将设备控制信息和可打印字符混合传送的概念却非常有用,这使设备制造商得以建立一种可用来传送上百条设备指令的途径。具体来说是使用称为控制序列或转义序列的一种由多个字符构成的序列。

典型的方式是首先发送编码27提醒设备将后续字符解释为控制序列而非普通的打印文本,之后跟随一个或多个字符指出某个具体的操作,这之后设备会返回到正常解释字符的状态(即不再将后续字符解释为控制序列)。例如由编码27后跟随可打印的字符“[2;10H”组成的序列会使一个DEC Digital VT-102终端将光标移动到屏幕第2行的第10个位置。这些序列存在着一些标准,广知的是基于VT-100系列终端的行为的ANSI X3.64(1979),但在应用中存在大量非标准的变化,特别是在技术进步的速度大大超过任何标准所能追赶的速度的打印机工业领域中。

在键盘上如何映射控制字符

基于ASCII的键盘上有个标为“Control”或“Ctrl”(有时也作“Cntl”)的键,其用法非常类似于换档键,即与其他字母或符号键一起按下。通过这种方式使用控制键将生成同时按下的字符键的ASCII编码字节的7位中,左起的兩個字元強制定為0;从而产生出32个ASCII控制码之一。例如,按下CTRL和字母G(十进制编码为71,二进制为01000111),产生编码7(振铃符,十进制编码7,或二进制00000111)。

键盘上有些单个键能产生控制码。例如标为“Backspace”的键通常产生编码8,“Tab”是编码9,“Enter”或“Return”是编码13(有些键盘上“Enter”可能是编码10)。

现在的键盘上有些键没有对应的ASCII字符或控制字符,例如光标控制键/箭头键和字处理功能键。这些键盘和其所连接的计算机通过三种方法通信:将一些在其他情况下不使用的控制字符定义新的用法、使用其他一些非ASCII的编码、或者使用由多个字符构成的控制序列。连接到独立的个人电脑上的键盘通常用前两种方法之一或两者都用,哑终端通常是使用控制序列。

设计目的

控制字符被设计分为若干组:打印和显示控制、数据结构化、传输控制、以及其他零散用途。

打印和显示控制

打印控制字符最先用于控制作为最早的输出设备的打印机的物理机件。回车(CR)意为将字符放置于纸边开始打印处(可能要移动到下一行,也可能不是)。换行(LF)表示将下个字符放置于新行出现的方向上的下一行处(也可能同时要移动到行起始处,也可能不是)。垂直和水平制表(VT/HT)则请求打印机将打印头移动到阅读方向上的下个制表位置。换页(FF)则开始一张新纸。退格(BS)将下个打印位置后退一个字符以便打印机可进行叠打而产生特殊字符(例如在文字下加下划线,在早期的字符打印机上是先打出文字后再用退格符将打印头退后,再叠打出下划线的)。移入(SI)和移出(SO)用于选择替换的字符集、字体、下划线或其他打印模式,然而更常见的是使用其他的转义序列来实现这些目的。

随着不使用纸张打印、并在字符放置、删除等方面提供了更多灵活性的终端机的出现,打印控制码也进一步适应了这些变化。例如馈页表示清除屏幕而非馈送下一张白纸。人们设计了更复杂的转义序列来应用新终端和新打印机功能的优点。单个字符的控制码已经不够用来支持新外围设备的所有功能了,控制字符和转义序列之间的差别也开始变得模糊。

数据结构化

分隔符(组、记录等)用于将数据结构化,通常用于磁带,为的是模拟穿孔卡片。介质结束(EM)意为警告磁带(或其他介质)即将到达末尾。

传输控制

传输控制字符是设计用来将数据包结构化以及控制在传输发生错误时何时进行重传的。

报头开始(SOH)用于标记数据包中的非数据部分——即含有地址和其他内务数据报文的部分。正文开始(SOT)标记报头的结束和正文的开始。正文结束(EOT)标记报文数据的结束。标准的常规是在正文结束符之前的两个字符处填入报文的校验和或CRC

转义符(ESC)用于在报文中放在一个正常情况下会被解释为控制字符的二进制值前,以避免该字符被作为控制字符解释。例如二进制值27的正确用法是ESC ESC。

替换符(SUB)用于请求将下个可打印字符转换为一个二进制值,通常是将第5位置零。由于一些传输介质(例如由打字机产生的纸张)仅能传输可打印的字符,因此用于这类情况时这样做很方便。

取消符(CAN)中止一个包的传输。否认符(NAK)请求重新传输一个包。确认符(ACK)表示传输内容被正确地接收。

当传输介质使用半双工(指某一时刻只能进行一个方向的传输)时,通常有一可在任意时间传输数据的主站和一个或多个可在获得准许后进行传输的从站。主站使用查询符(ENQ)来要求从站发送其下条报文。从站通过发出传输结束符(EOT)来表示其已完成了传输。

设备控制码原本是不特定的,是对每种设备定义不同的。然而在数据传输中一种普遍的需要是当接收方不能接收更多数据时需要请求发送方立即暂停传输。数据设备公司发明了一套协议,其用19(DC3,也即CTRL-S或XOFF)来停止传输,并用17(DC1,也即CTRL-Q或XON)来开始传输。籍此制造商们能不必在数据缆线中用专门的传输控制线来控制传输,这节约了成本且由于减少了缆线中连接的数量也增加了作业的可靠程度。

数据链路转义(DLE)告诉数据链路的另一端结束一个会话,以便对方释放线路资源。

零散用途

许多ASCII控制字符是为当时使用而现在很少见到的设备而设计的。例如编码22,同步空闲(SYN),原本用于同步调制解调器(其必须连续发送数据)在没有数据要传送时发送。(现在的系统一般使用起始位来告知要传送的字的开始。)

编码0,空字符,是个特例。它在纸带中就是那些没有穿孔的地方,因此把它作为不存在的字符来对待是很方便的。

编码127同样是个特例。在二进制编码中它的所有位都是1,这使得它可方便地用来清除作为当时普遍使用的存储介质的纸带中的一段,把要清除的部分全部穿孔就成了DEL字符。纸带很快被废弃了,因此这个特色也几乎不用了。

然而由于其编码处于其他可打印的字符占用的区域中,许多计算机把它作为一个额外的可打印字符来使用(通常是一个实心的黑色方块字符,可用叠打来盖除文字)。

七位ASCII定义了33个代码作为控制字符,它们是0到31、以及127,(位于0x00-0x1F及0x7F)。

US-ASCII控制字符
Seq十进十六进缩写字符名
000x00NULNull(空)
^A010x01SOHStart of Heading(报头开始)
^B020x02STXStart of Text(正文开始)
^C030x03ETXEnd of Text(正文结束)
^D040x04EOTEnd of Transmission(传输结束)
^E050x05ENQEnquiry(查询)
^F060x06ACKAcknowledge(确认)
^G070x07BELBell(振铃)
^H080x08BSBackspace(退格)
^I090x09HTHorizontal Tab(水平制表)
^J100x0ALFLine Feed(馈行)
^K110x0BVTVertical Tab(垂直制表)
^L120x0CFFForm Feed(馈页)
^M130x0DCRCarriage Return(回车)
^N140x0ESOShift Out(移出)
^O150x0FSIShift In(移入)
^P160x10DLEData Link Escape(数据链路转义)
^Q170x11DC1Device Control 1(设备控制1)
^R180x12DC2Device Control 2(设备控制2)
^S190x13DC3Device Control 3(设备控制3)
^T200x14DC4Device Control 4(设备控制4)
^U210x15NAKNegative Acknowledge(否认)
^V220x16SYNSynchronous Idle(同步空闲)
^W230x17ETBEnd of Transmission Block(传输块结束)
^X240x18CANCancel(取消)
^Y250x19EMEnd of Medium(介质结束)
^Z260x1ASUBSubstitute(替换)
^[270x1BESCEscape(转义)
^\280x1CFSFile Separator(文件分隔符)
^]290x1DGSGroup Separator(分组符)
^^300x1ERSRecord Separator(记录分隔符)
^_310x1FUSUnit Separator(单元分隔符)
^?1270x7FDELDelete(删除)

兼容的八位ISO/IEC 8859-1加上了从ISO/IEC 6429定义的从128到159的32个代码,位于0x80-0x9F。

ISO-8859-n的控制字符
十进十六进缩写字符名
1280x80PADPadding Character(填充字符)
1290x81HOPHigh Octet Preset(高字节前置)
1300x82BPHBreak Permitted Here(此处允许中断)
1310x83NBHNo Break Here(此处禁止中断)
1320x84INDIndex(索引)
1330x85NELNext Line(下一行)
1340x86SSAStart of Selected Area(选择区域开始)
1350x87ESAEnd of Selected Area(选择区域结束)
1360x88HTSHorizontal Tab Set(水平制表设置)
1370x89HTJHorizontal Tab Justified(水平制表调整)
1380x8AVTSVertical Tab Set(垂直制表设置)
1390x8BPLDPartial Line Forward(部分行前移)
1400x8CPLUPartial Line Backward(部分行后移)
1410x8DRIReverse Line Feed(逆向馈行)
1420x8ESS2Single-Shift 2(单个移动2)
1430x8FSS3Single-Shift 3(单个移动3)
1440x90DCSDevice Control String(设备控制串)
1450x91PU1Private Use 1(私用1)
1460x92PU2Private Use 2(私用2)
1470x93STSSet Transmit State(发送规则设置)
1480x94CCHCancel Character(取消字符)
1490x95MWMessage Waiting(消息等待)
1500x96SPAStart of Protected Area(保护区域开始)
1510x97EPAEnd of Protected Area(保护区域结束)
1520x98SOSStart of String(串开始)
1530x99SGCISingle Graphic Char Intro(单个图形字符描述)
1540x9ASCISingle Char Intro(单个字符描述)
1550x9BCSIControl Sequence Intro(控制顺序描述)
1560x9CSTString Terminator(串终止)
1570x9DOSCOS Command(操作系统指令)
1580x9EPMPrivate Message(私讯)
1590x9FAPCApp Program Command(应用程序命令)

参看

  • 符号控制键使用
  • 转义字符
  • 转换键

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.