天河做网站设计,wordpress+模版+推荐,网站建设学校,免费域名空间哪个好转载:ASCII字符集中的功能/控制字符 Function/Control Code/Character in ASCII 【什么是 Function Code 功能码或 Function Character 功能字符】 ASCII 字符集#xff0c;大家都知道吧#xff0c;最基本的包含了 128 个字符。其中前 32 个#xff0c; 0-31 #xff0c;即…转载:ASCII字符集中的功能/控制字符 Function/Control Code/Character in ASCII 【什么是 Function Code 功能码或 Function Character 功能字符】 ASCII 字符集大家都知道吧最基本的包含了 128 个字符。其中前 32 个 0-31 即 0x00-0x1F 都是不可见字符。这些字符就叫做控制字符。 这些字符没法打印出来但是每个字符都对应着一个特殊的控制功能的字符简称功能字符或功能码 Function Code 。 简言之 ASCII 中前 32 个字符统称为 Function Code 功能字符。 此外由于 ASCII 中的 127 对应的是 Delete 也是不可见的所以此处根据笔者的理解也可以归为 Function Code 。 此类字符对应不同的“功能”起到一定的“控制作用”所以称为控制字符。 关于每个控制字符的控制功能缩写参见下表 表格 1 ASCII 中的控制字符 十 进制 十六 进制 控制 字符 转义 字符 * 说明 Ctrl 下列字母 * 0 00 NUL /0 Null character( 空字符 ) (Shift 2) 1 01 SOH Start of Header( 标题开始 ) A 2 02 STX Start of Text( 正文开始 ) B 3 03 ETX End of Text( 正文结束 ) C 4 04 EOT End of Transmission( 传输结束 ) D 5 05 ENQ Enquiry( 请求 ) E 6 06 ACK Acknowledgment( 收到通知 / 响应 ) F 7 07 BEL /a Bell ( 响铃 ) G 8 08 BS /b Backspace( 退格 ) H 9 09 HT /t Horizontal Tab( 水平制表符 ) I 10 0A LF /n Line feed( 换行键 ) J 11 0B VT /v Vertical Tab( 垂直制表符 ) K 12 0C FF /f Form feed( 换页键 ) L 13 0D CR /r Carriage return( 回车键 ) M 14 0E SO Shift Out( 不用切换 ) N 15 0F SI Shift In( 启用切换 ) O 16 10 DLE Data Link Escape( 数据链路转义 ) P 17 11 DC1 Device Control 1( 设备控制 1) /XON(Transmit On) Q 18 12 DC2 Device Control 2( 设备控制 2) R 19 13 DC3 Device Control 3( 设备控制 3) /XOFF(Transmit Off) S 20 14 DC4 Device Control 4( 设备控制 4) T 21 15 NAK Negative Acknowledgement( 拒绝接收 / 无响应 ) U 22 16 SYN Synchronous Idle( 同步空闲 ) V 23 17 ETB End of Trans the Block( 传输块结束 ) W 24 18 CAN Cancel( 取消 ) X 25 19 EM End of Medium( 已到介质末端 / 介质存储已满 ) Y 26 1A SUB Substitute( 替补 / 替换 ) Z 27 1B ESC /e Escape( 溢出 / 逃离 / 取消 ) [ 28 1C FS File Separator( 文件分割符 ) / 29 1D GS Group Separator( 分组符 ) ] 30 1E RS Record Separator( 记录分隔符 ) ^ (Shit 6) 31 1F US Unit Separator( 单元分隔符 ) _ (Shift -) 32 20 SP White space [Space] * 127 7F DEL Delete( 删除 ) [Delete] * 注 (*) 1. 转义字符即在 C 语言中或其他地方如何表示。 2. 用键盘输入控制字符其中 32 是空格键 127 是 Delete 键都不需要加 Ctrl 键即可直接输入。 3. 可以通过 “Ctrl 对应按键 ” 实现上述控制字符的输入 , 你可能遇到的一些比如 : 用 CtrlV 输入 SYNC CtrlM 输入Enter 当然也可以直接用 Enter 键但是在 Windows 下面其可能会发送两个字符 CR 和 LF CtrlQ 输入 XON CtrlS 输入 XOFF 等等。 其具体每个控制字符的含义详解介绍如下 【 ASCII 中的 Function/Control Code 功能字符的详细含义】 0 – NUL – NUL l 字符 / 空字符 ASCII 字符集中的空字符 NULL 起初本意可以看作为 NOP 中文意为空操作就是啥都不做的意思此位置可以忽略一个字符。 之所以有这个空字符主要是用于计算机早期的记录信息的纸带此处留个 NUL 字符意思是先占这个位置以待后用比如你哪天想起来了在这个位置在放一个别的啥字符之类的。 后来呢 NUL 字符被用于 C 语言中字符串的终结符当一个字符串中间出现 NUL / NULL 代码里面表现为 /0 的时候就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串多长都行当然只要你内存放得下然后最后加一个 /0, 即空字符意思是当前字符串到此结束。 1 – SOH – S tart O f H eading 标题开始 如果信息沟通交流主要以命令和消息的形式的话 SOH 就可以用于标记每个消息的开始。 1963 年最开始 ASCII 标准中把此字符定义为 Start of Message 后来又改为现在的 Start Of Heading 。 现在这个 SOH 常见于主从 master-slave 模式的 RS232 的通信中一个主设备以 SOH 开头和从设备进行通信。这样方便从设备在数据传输出现错误的时候在下一次通信之前去实现重新同步 resynchronize 。如果没有一个清晰的类似于 SOH 这样的标记去标记每个命令的起始或开头的话那么重新同步就很难实现了。 2 – STX – S tart O f T ext 文本开始 3 – ETX – E nd Of T ext 文本结束 通过某种通讯协议去传输的一个数据包称为一帧的话常会包含一个帧头包含了寻址信息即你是要发给谁要发送到目的地是哪里其后跟着真正要发送的数据内容。 而 STX 就用于标记这个数据内容的开始。接下来是要传输的数据最后是 ETX 表明数据的结束。 其中中间具体传输的数据内容 ASCII 规范并没有去定义其和你所用的传输协议具体自己要传什么数据有关。 帧头 数据或文本内容 SOH表明帧头开始 。。。。帧头信息比如包含了目的地址表明你发送给谁等等 STX 表明数据开始 。。。真正要传输的数据 ETX 表明数据结束 不过其中有趣的是 1963 年 ASCII 标准最初版本的时候把现在的 STX 叫做 EOA End Of Address ETX 叫做End Of Message 。这是因为最早的时候一个消息中总是包含一个开始符和一个终止符。现在的新的定义使得可以去发送一个固定长度的命令而只用一个 SOH 表明帧头开始即可而不需要再加上一个命令终止符或帧头结束符。 总结一下 一般发送一个消息包含了一个帧头和后面真正要传的数据。 而对于帧头属于控制类的信息这部分之前属于命令后面的真实要传的数据属于数据。即消息 帧头 数据。 而之前的命令都要有个开始符和结束符这样就是 消息 帧头 要传的数据 帧头开始 帧头信息 帧头结束 要传的数据 而现在新的定义使得只需要 消息 帧头 要传的数据 SOH 表明帧头开始 帧头信息 要传的数据 SOH 表明帧头开始 帧头信息 STX 数据内容 ETX 就可以少用一个帧头结束符。 而如今在很多协议中也常见到一个固定长度的帧头后面紧接着就是数据了而没有所谓的帧头结束符之类的东西去区分帧头和数据。 4 – EOT – E nd O f T ransmission 传输结束 5 – ENQ – ENQ uiry 请求 6 – ACK – ACK nowledgment 回应 / 响应 7 – BEL – [audible] BEL l 在 ASCII 字符集中 BEL 是个比较有意思的东东。因为其原先本意不是用来数据编码的于此相反 ASCII 中的其他字符都是用于字符编码即用什么字符代表什么含义或者起到控制设备的作用。 BEL 用一个可以听得见的声音来吸引人们的注意其原打算即用于计算机也用于一些设备比如打印机等。 C 语言里面也支持此 BEL 用 /a 来实现这个响铃。 8 – BS – B ackS pace 退格键 退格键的功能随着时间变化意义也变得不同了。 起初意思是在打印机和电传打字机上往回移动一格光标以起到强调该字符的作用。比如你想要打印一个 a 然后加上退格键后就成了 aBS^ 。在机械类打字机上此方法能够起到实际的强调字符的作用但是对于后来的 CTR 下时期来说就无法起到对应效果了。 而现代所用的退格键不仅仅表示光标往回移动了一格同时也删除了移动后该位置的字符。在 C 语言中退格键可以用/b 表示。 9 – HT – H orizontal T ab 水平制表符 ASCII 中的 HT 控制符的作用是用于布局的。 其控制输出设备前进到下一个表格去处理。而制表符 Table/Tab 的宽度也是灵活不固定的只不过多数设备上制表符Tab 的宽度都预定义为 8 。水平制表符 HT 不仅能减少数据输入者的工作量对于格式化好的文字来说还能够减少存储空间因为一个 Tab 键就代替了 8 个空格所以说省空间。 对于省空间的优点我们现在来看可能会觉得可笑因为现在存储空间已足够大一般来说根本不会需要去省那么点可怜的存储空间但是实际上在计算机刚发明的时候存储空间主要指的是内存极其有限也极其昂贵而且像 ZIP 等压缩方法也还没发明呢所以对于当时来说对于存储空间那是能够省一点是一点省任何一点都是好的也都是不容易的省空间就是省钱啊。 C 语言中用 /t 表示制表符。 10 – LF – L ine F eed 换行 LF 直译为给打印机等喂一行意思就是所说的换行。 换行字符是 ASCII 字符集中被误用的字符中的其中一个。 LF 的最原始的含义是移动打印机的头到下一行。而另外一个 ASCII 字符 CR Carriage Return 才是将打印机的头移到最左边即一行的开始行首。很多串口协议和 MS-DOS 及 Windows 操作系统也都是这么实现的。 而于此不同对于 C 语言和 Unix 操作系统其重新定义了 LF 字符的含义为新行即 LF 和 CR 的组合才能表达出的回车且换行的意思。 虽然你可以争论哪种用法是错的但是不可否认是从程序的角度出发 C 语言和 Unix 对此 LF 的含义实现显得就很自然而 MS-DOS 的实现更接近于 LF 的本意。 如果最开始 ASCII 标准中及定义 CF 也定义 newline 那样意思会清楚会更好理理解 LF 表示物理上的设备控制方面的移动到下一行并没有移动到行首 新行 newline 表示逻辑上文本分隔符即回车换行。 不过呢现在人们常将 LF 用做 newline 新行的功能而大多数文本编辑软件也都可以处理单个 LF 或者 CR/LF 的组合了。 LF 在 C 语言中用 /n 表示。 11 – VT – V ertical T ab 垂直制表符 垂直制表符类似于水平制表符 Tab 目的是为了减少布局中的工作同时也减少了格式化字符时所需要存储字符的空间。 VT 控制码用于跳到下一个标记行。说实话还真没看到有些地方需要用这个 VT 呢因为一般在换行的时候都是用 LF 代替 VT 了。 12 – FF – F orm F eed 换页 设计换页键是用来控制打印机行为的。当打印机收到此键码的时候打印机移动到下一页。不同的设备的终端对此控制码所表现的行为各不同。有些会去清除屏幕而其他有的只是显示 ^L 字符或者是只是新换一行而已。 Shell 脚本程序Bash 和 Tcsh 的实现方式是把 FF 看作是一个清除屏幕的命令。 C 语言程序中用 /f 表示 FF 换页。 13 – CR – Carriage return 机器的滑动部分 / 底座 返回 - 回车 CR 回车的原意是让打印头回到左边界并没有移动到下一行。 随着时间流逝后来人把 CR 的意思弄成了 Enter 键用于示意输入完毕。在数据以屏幕显示的情况下人们在 Enter 的同时也希望把光标移动到下一行。因此 C 语言和 Unix 操作系统重新定义了 LF 的意思使其表示为移动到下一行。当输入 CR 去存储数据的时候软件也常常隐式地将其转换为 LF 。 14 – SO – S hift O ut 不用切换 15 – SI – S hift I n 启用切换 早在 1960s 年代定义 ASCII 字符集的人就已经懂得了设计字符集不单单可以用于英文字符集也要能应用于外文字符集是很重要的。 定义 Shift In 和 Shift Out 的含义即考虑到了此点。 最开始其意为在西里尔语和拉丁语之间切换。西里尔 ASCII 定义中 KOI-7 用到了 Shift 字符。拉丁语用 Shift 去改变打印机的字体。在此种用途中 SO 用于产生双倍宽度的字符而用 SI 打印压缩的字体。 16 – DLE – D ata L ink E scape 数据链路转义 有时候我们需要在正在进行的通信过程中去发送一些控制字符。但是总有一些情况下这些控制字符却被看成了普通的数据流而没有起到对应的控制效果。而 ASCII 标准中定义 DLE 来解决这类问题。 如果数据流中检测到了 DLE 数据接收端则对其后面接下来的数据流中的字符另作处理。而关于具体如何处理这些字符 ASCII 规范中则没有具体定义而只是弄了个 DLE 去打断正常数据的处理告诉接下来的数据要特殊对待。根据Modem 中的 Hayes 通信协议 DLE 定义为“无声 无声”。以我的观点这样可能会更好如果 Hayes 协议没有把DLE 处理为嵌入通讯的无声状态那样就符合现存的标准了。然而 Hayes 的开发者却觉得 用的频率要远高于原始的DLE 所以才这么定义了。 17 – DC1 – D evice C ontrol 1 / XON – Transmission on 这个 ASCII 控制字符尽管原先定义为 DC1 但是现在常表示为 XON 用于串行通信中的软件流控制。其主要作用为在通信被控制码 XOFF 中断之后重新开始信息传输。用过串行终端的人应该还记得当有时候数据出错了按 CtrlQ等价于 XON 有时候可以起到重新传输的效果。这是因为此 CtrlQ 键盘序列实际上就是产生 XON 控制码其可以将那些由于终端或者主机方面由于偶尔出现的错误的 XOFF 控制码而中断的通信解锁使其正常通信。 18 – DC2 – D evice C ontrol 2 19 – DC3 – D evice C ontrol 3 / XOFF – Transmission off 传输中断 20 – DC4 – D evice C ontrol 4 21 – NAK – N egative A cK nowledgment 负面响应 - 无响应 , 非正常响应 22 – SYN – SYN chronous idle 23 – ETB – E nd of T ransmission B lock 块传输中止 24 – CAN – CAN cel 取消 25 – EM – E nd of M edium 已到介质末端介质存储已满 EM 用于当数据存储到达串行存储介质末尾的时候就像磁带或磁头滚动到介质末尾一样。其用于表述数据的逻辑终点即不必非要是物理上的达到数据载体的末尾。 26 – SUB – SUB stitute character 替补 / 替换 27 – ESC – ESC ape 逃离 / 取消 字符 Escape 是 ASCII 标准的首创的由 Bob Bemer 提议的。用于开始一段控制码的扩展字符。如此即可以不必将所有可能想得到的字符都放到 ASCII 标准中了。因为新的技术可能需要新的控制命令而 ESC 可以用作这些字符命令的起始标志。 ESC 广泛用于打印机和终端去控制设备设置比如字体字符位置和颜色等等。如果最开始的 ASCII 标准中没有定义 ESC 估计 ASCII 标准早就被其他标准所替代了因为其没有包含这些新出现的字符所以肯定会有其他新的标准出现用于表示这些字符的。即 ESC 给开发者提供了可以根据需要而定义新含义的字符的可能。 28 – FS – F ile S eparator 文件分隔符 文件分隔符是个很有意思的控制字符因为其可以让我们看到 1960s 年代的时候计算机技术是如何组织的。我们现在习惯于随即访问一些存储介质比如 RAM 磁盘但是在定义 ASCII 标 准的那个年代大部分数据还是顺序的串行的而不是随机访问的。此处所说的串行的不仅仅指的是串行通信还指的是顺序存储介质比如穿孔卡片纸带 磁带等。在串行通信的时代设计这么一个用于表示文件分隔符的控制字符用于分割两个单独的文件是一件很明智的事情。而 FS 的原因就在于此。 29 – GS – G roup S eparator 分组符 ASCII 定义控制字符的原因中其中一条就是考虑到了数据存储方面的情况。大部分情况下数据库的建立都和表有关包含了对应的记录。同一个表中的所有的记录属于同一类型。不同的表中的记录属于对应的不同的类型。而分组符 GS 就是用来分隔串行数据存储系统中的不同的组。值得注意的是当时还没有使用 word 的表格当时 ASCII 时代的人把他叫做组。 30 – RS – R ecord S eparator 记录分隔符 记录分隔符 RS 用于分隔在一个组或表内的多个记录。 31 – US – U nit S eparator 单元分隔符 在 ASCII 定义中在数据库中所存储的最小的数据项叫做 Unit 单元。而现在我们称其 field 域。单元分隔符 US 用于分割串行数据存储环境下的不同的域。 现在大部分的数据库实现要求大部分类型都拥有固定的长度。 尽管大部分时候可能用不到但是对于每一个域却都要分配足够大的空间用于存放最大可能的成员变量。这样的做法占用了大量的存储空间而 US 控制码允许域具有可变的长度。在 1960s 年代数据存储空间很有限用 US 这个单元分隔符将不同单元分隔开这样就可以实现更高效地存储那些宝贵的数据。另一方面串行存储的存储效率远低于RAM 和磁盘中所实现的表格存储。我个人无法想象如果现在的数据还是存储在自带或者带滚轮的磁带上会是何种景象。 32 – SP – White SP ace 空格键 也许你会争论说空格键是否真的能算是一个控制字符因为现在在普通文字中使用空格键是如此常见。 但是既然水平制表符和退格键在 ASCII 中 都被叫做控制字符了那么我觉得也很自然地可以把空格键向前的空格也叫做控制字符毕竟其本身并不代表一个真正的可见的字符而仅仅只是很常用于 输出设备用于处理位置前向移动一格清除当前位置的内容而已。在很多程序中比如字符处理程序白空格同样可能从导致行尾转到下一行行首而网络浏览器 将多个空格组合成单个空格输出。 所以这更加坚定了我的想法觉得完全可以把空格看成是一个控制字符而不仅仅是一个很独特的普通字符。 127 – DEL – DEL ete 删除 有人也许会问为何 ASCII 字符集中的控制字符的值都是很小的即 0-32 而 DEL 控制字符的值却很大是 127 。这是由于这个特殊的字符是为纸带而定义的。而在那个时候绝大多数的纸带都是用 7 个孔洞去编码数据的。而 127 这个值所对应的二进制值为 111 1111b 表示所有 7 个比特位都是高所以将 DEL 用在现存的纸带上时所有的洞就都被穿孔了就把已经存在的数据都擦出掉了就起到了对应的删除的作用了。 转载于:https://www.cnblogs.com/markytwine/p/4441830.html