ASCII码专题永利国际网站

ASCII(American Standard Code for Information
Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了
128 个字符,用一个字节就可以存储,它等同于国际标准 ISO/IEC 646。ASCII
规范于 1967 年第一次发布,最后一次更新是在 1986 年,它包含了 33
个控制字符(具有某些特殊功能但是无法显示的字符)和 95 个可显示字符。



今天产品部同事报告了一个BUG,经过调试发现,由于用户输入的字符串中,包含字符0x1E,
也就是”记录分隔符”(Record Separator, Notepad++
显示为[RS]),导致JavaScript
XML解析遭遇错误。于是就想在字符串中过滤掉这些没多大用途的字符,同时又要保留部分常用的字符,例如换行,回车和水平制表符。于是写了下面一个
PHP 函数: 

ASCII码表

 

/**
* 清理字符串中的部分不可见控制字符
*
* @param string $string 待处理字符串
* @return string 处理后的字符串
* @author fising(at)qq.com
*/
public static function clearInvisibleCharacter($string = '')
{
/* 排除 tab, n, r 三个字符 */
$do_not_searches = array(chr(9), chr(10), chr(13));
/* 需清理的字符列表 */
$searches = array(); 
for ($i = 0; $i <= 31; $i++)
{
if (!in_array(chr($i), $do_not_searches))
{
$searches[] = chr($i);
}
} 
$searches[] = chr(127); 
return str_replace($searches, '', $string);
}
二进制 十进制 十六进制 缩写/字符 解释
00000000 0 00 NUL (NULL) 空字符
00000001 1 01 SOH (Start Of Headling) 标题开始
00000010 2 02 STX (Start Of Text) 正文开始
00000011 3 03 ETX (End Of Text) 正文结束
00000100 4 04 EOT (End Of Transmission) 传输结束
00000101 5 05 ENQ (Enquiry) 请求
00000110 6 06 ACK (Acknowledge) 回应/响应/收到通知
00000111 7 07 BEL (Bell) 响铃
00001000 8 08 BS (Backspace) 退格
00001001 9 09 HT (Horizontal Tab) 水平制表符
00001010 10 0A LF/NL(Line Feed/New Line) 换行键
00001011 11 0B VT (Vertical Tab) 垂直制表符
00001100 12 0C FF/NP (Form Feed/New Page) 换页键
00001101 13 0D CR (Carriage Return) 回车键
00001110 14 0E SO (Shift Out) 不用切换
00001111 15 0F SI (Shift In) 启用切换
00010000 16 10 DLE (Data Link Escape) 数据链路转义
00010001 17 11 DC1/XON (Device Control 1/Transmission On) 设备控制1/传输开始
00010010 18 12 DC2 (Device Control 2) 设备控制2
00010011 19 13 DC3/XOFF (Device Control 3/Transmission Off) 设备控制3/传输中断
00010100 20 14 DC4 (Device Control 4) 设备控制4
00010101 21 15 NAK (Negative Acknowledge) 无响应/非正常响应/拒绝接收
00010110 22 16 SYN (Synchronous Idle) 同步空闲
00010111 23 17 ETB (End of Transmission Block) 传输块结束/块传输终止
00011000 24 18 CAN (Cancel) 取消
00011001 25 19 EM (End of Medium) 已到介质末端/介质存储已满/介质中断
00011010 26 1A SUB (Substitute) 替补/替换
00011011 27 1B ESC (Escape) 逃离/取消
00011100 28 1C FS (File Separator) 文件分割符
00011101 29 1D GS (Group Separator) 组分隔符/分组符
00011110 30 1E RS (Record Separator) 记录分离符
00011111 31 1F US (Unit Separator) 单元分隔符
00100000 32 20 (Space) 空格
00100001 33 21 !  
00100010 34 22 "  
00100011 35 23 #  
00100100 36 24 $  
00100101 37 25 %  
00100110 38 26 &  
00100111 39 27  
00101000 40 28 (  
00101001 41 29 )  
00101010 42 2A *  
00101011 43 2B +  
00101100 44 2C ,  
00101101 45 2D  
00101110 46 2E .  
00101111 47 2F /  
00110000 48 30 0  
00110001 49 31 1  
00110010 50 32 2  
00110011 51 33 3  
00110100 52 34 4  
00110101 53 35 5  
00110110 54 36 6  
00110111 55 37 7  
00111000 56 38 8  
00111001 57 39 9  
00111010 58 3A :  
00111011 59 3B ;  
00111100 60 3C <  
00111101 61 3D =  
00111110 62 3E >  
00111111 63 3F ?  
01000000 64 40 @  
01000001 65 41 A  
01000010 66 42 B  
01000011 67 43 C  
01000100 68 44 D  
01000101 69 45 E  
01000110 70 46 F  
01000111 71 47 G  
01001000 72 48 H  
01001001 73 49 I  
01001010 74 4A J  
01001011 75 4B K  
01001100 76 4C L  
01001101 77 4D M  
01001110 78 4E N  
01001111 79 4F O  
01010000 80 50 P  
01010001 81 51 Q  
01010010 82 52 R  
01010011 83 53 S  
01010100 84 54 T  
01010101 85 55 U  
01010110 86 56 V  
01010111 87 57 W  
01011000 88 58 X  
01011001 89 59 Y  
01011010 90 5A Z  
01011011 91 5B [  
01011100 92 5C  
01011101 93 5D ]  
01011110 94 5E ^  
01011111 95 5F _  
01100000 96 60 `  
01100001 97 61 a  
01100010 98 62 b  
01100011 99 63 c  
01100100 100 64 d  
01100101 101 65 e  
01100110 102 66 f  
01100111 103 67 g  
01101000 104 68 h  
01101001 105 69 i  
01101010 106 6A j  
01101011 107 6B k  
01101100 108 6C l  
01101101 109 6D m  
01101110 110 6E n  
01101111 111 6F o  
01110000 112 70 p  
01110001 113 71 q  
01110010 114 72 r  
01110011 115 73 s  
01110100 116 74 t  
01110101 117 75 u  
01110110 118 76 v  
01110111 119 77 w  
01111000 120 78 x  
01111001 121 79 y  
01111010 122 7A z  
01111011 123 7B {  
01111100 124 7C |  
01111101 125 7D }  
01111110 126 7E ~  
01111111 127 7F DEL (Delete) 删除

 

 

对控制字符的解释

ASCII 编码中第 0~31 个字符(开头的 32 个字符)以及第 127
个字符(最后一个字符)都是不可见的(无法显示),但是它们都具有一些特殊功能,所以称为控制字符( Control
Character)或者功能码(Function Code)。

这 33
个控制字符大都与通信、数据存储以及老式设备有关,有些在现代电脑中的含义已经改变了。

有些控制符需要一定的计算机功底才能理解,初学者可以跳过,选择容易的理解即可。

 

下面列出了部分控制字符的具体功能:

  • #### NUL (0)

    NULL,空字符。空字符起初本意可以看作为
    NOP(中文意为空操作,就是啥都不做的意思),此位置可以忽略一个字符。

    之所以有这个空字符,主要是用于计算机早期的记录信息的纸带,此处留个
    NUL
    字符,意思是先占这个位置,以待后用,比如你哪天想起来了,在这个位置在放一个别的啥字符之类的。

    后来呢,NUL 被用于C语言中,表示字符串的结束,当一个字符串中间出现
    NUL
    时,就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串,多长都行,当然只要你内存放得下,然后最后加一个,即空字符,意思是当前字符串到此结束。

  • #### SOH (1)

    Start Of
    Heading,标题开始。如果信息沟通交流主要以命令和消息的形式的话,SOH
    就可以用于标记每个消息的开始。

    1963年,最开始 ASCII 标准中,把此字符定义为 Start of
    Message,后来又改为现在的 Start Of Heading。

    现在,这个 SOH 常见于主从(master-slave)模式的 RS232
    的通信中,一个主设备,以 SOH
    开头,和从设备进行通信。这样方便从设备在数据传输出现错误的时候,在下一次通信之前,去实现重新同步(resynchronize)。如果没有一个清晰的类似于
    SOH
    这样的标记,去标记每个命令的起始或开头的话,那么重新同步,就很难实现了。

  • #### STX (2) 和 ETX (3)

    STX 表示 Start Of Text,意思是“文本开始”;ETX 表示 End Of
    Text,意思是“文本结束”。

    通过某种通讯协议去传输的一个数据(包),称为一帧的话,常会包含一个帧头,包含了寻址信息,即你是要发给谁,要发送到目的地是哪里,其后跟着真正要发送的数据内容。

    而 STX,就用于标记这个数据内容的开始。接下来是要传输的数据,最后是
    ETX,表明数据的结束。

    而中间具体传输的数据内容,ASCII
    并没有去定义,它和你所用的传输协议有关。

    帧头

  • #### BEL (7)

    BELl,响铃。在 ASCII 编码中,BEL 是个比较有意思的东西。BEL
    用一个可以听得见的声音来吸引人们的注意,既可以用于计算机,也可以用于周边设备(比如打印机)。

    注意,BEL
    不是声卡或者喇叭发出的声音,而是蜂鸣器发出的声音,主要用于报警,比如硬件出现故障时就会听到这个声音,有的计算机操作系统正常启动也会听到这个声音。蜂鸣器没有直接安装到主板上,而是需要连接到主板上的一种外设,现代很多计算机都不安装蜂鸣器了,即使输出
    BEL 也听不到声音,这个时候 BEL 就没有任何作用了。

  • #### BS (8)

    BackSpace,退格键。退格键的功能,随着时间变化,意义也变得不同了。

    退格键起初的意思是,在打印机和电传打字机上,往回移动一格光标,以起到强调该字符的作用。比如你想要打印一个
    a,然后加上退格键后,就成了
    aBS^。在机械类打字机上,此方法能够起到实际的强调字符的作用,但是对于后来的
    CTR 下时期来说,就无法起到对应效果了。

    而现代所用的退格键,不仅仅表示光标往回移动了一格,同时也删除了移动后该位置的字符。

  • #### HT (9)

    Horizontal Tab,水平制表符,相当于 Table/Tab 键。

    水平制表符的作用是用于布局,它控制输出设备前进到下一个表格去处理。而制表符
    Table/Tab 的宽度也是灵活不固定的,只不过在多数设备上制表符 Tab
    都预定义为 4 个空格的宽度。

    水平制表符 HT
    不仅能减少数据输入者的工作量,对于格式化好的文字来说,还能够减少存储空间,因为一个Tab键,就代替了
    4 个空格。

  • #### LF (10)

    Line Feed,直译为“给打印机等喂一行”,也就是“换行”的意思。LF 是 ASCII
    编码中常被误用的字符之一。

    LF 的最原始的含义是,移动打印机的头到下一行。而另外一个 ASCII
    字符,CR(Carriage
    Return)才是将打印机的头移到最左边,即一行的开始(行首)。很多串口协议和
    MS-DOS 及 Windows 操作系统,也都是这么实现的。

    而C语言和 Unix 操作系统将 LF 的含义重新定义为“新行”,即 LF 和 CR
    的组合效果,也就是回车且换行的意思。

    从程序的角度出发,C语言和 Unix 对 LF 的定义显得更加自然,而 MS-DOS
    的实现更接近于 LF 的本意。

    现在人们常将 LF
    用做“新行(newline)”的功能,大多数文本编辑软件也都可以处理单个 LF
    或者 CR/LF 的组合了。

  • #### VT (11)

    Vertical Tab,垂直制表符。它类似于水平制表符
    Tab,目的是为了减少布局中的工作,同时也减少了格式化字符时所需要存储字符的空间。VT
    控制符用于跳到下一个标记行。

    说实话,还真没看到有些地方需要用 VT,因为一般在换行的时候都是用 LF
    代替 VT 了。

  • #### FF (12)

    Form
    Feed,换页。设计换页键,是用来控制打印机行为的。当打印机收到此键码的时候,打印机移动到下一页。

    不同的设备的终端对此控制符所表现的行为各不同,有些会清除屏幕,有些只是显示^L字符,有些只是新换一行而已。例如,Unix/Linux
    下的 Bash Shell 和 Tcsh 就把 FF 看做是一个清空屏幕的命令。

  • #### CR (13)

    Carriage return,回车,表示机器的滑动部分(或者底座)返回。

    CR
    回车的原意是让打印头回到左边界,并没有移动到下一行的意思。随着时间的流逝,后来人们把
    CR 的意思弄成了 Enter 键,用于示意输入完毕。

    在数据以屏幕显示的情况下,人们按下 Enter
    的同时,也希望把光标移动到下一行,因此C语言和 Unix 重新定义了 CR
    的含义,将其表示为移动到下一行。当输入 CR
    时,系统也常常隐式地将其转换为LF。

  • #### SO (14) 和 SI (15)

    SO,Shift Out,不用切换;SI,Shift In,启用切换。

    早在 1960s 年代,设计 ASCII 编码的美国人就已经想到了,ASCII
    编码不仅仅能用于英文,也要能用于外文字符集,这很重要,定义 Shift In
    和 Shift Out 正是考虑到了这点。

    最开始,其意为在西里尔语和拉丁语之间切换。西里尔语 ASCII(也即 KOI-7
    编码)将 Shift 作为一个普通字符,而拉丁语
    ASCII(也就是我们通常所说的 ASCII)用 Shift
    去改变打印机的字体,它们完全是两种含义。

    在拉丁语 ASCII 中,SO 用于产生双倍宽度的字符(类似于全角),而用 SI
    打印压缩的字体(类似于半角)。

  • #### DLE (16)

    Data Link Escape,数据链路转义。

    有时候我们需要在通信过程中发送一些控制字符,但是总有一些情况下,这些控制字符被看成了普通的数据流,而没有起到对应的控制效果,ASCII
    编码引入 DLE 来解决这类问题。

    如果数据流中检测到了
    DLE,数据接收端会对数据流中接下来的字符另作处理。但是具体如何处理,ASCII
    规范中并没有定义,只是弄了个 DLE
    去打断正常的数据流,告诉接下来的数据要特殊对待。

  • #### DC1 (17)

    Device Control 1,或者 XON – Transmission on。

    这个 ASCII 控制符尽管原先定义为 DC1, 但是现在常表示为
    XON,用于串行通信中的软件流控制。其主要作用为,在通信被控制符 XOFF
    中断之后,重新开始信息传输。

    用过串行终端的人应该还记得,当有时候数据出错了,按
    Ctrl+Q(等价于XON)有时候可以起到重新传输的效果。这是因为,此 Ctrl+Q
    键盘序列实际上就是产生 XON
    控制符,它可以将那些由于终端或者主机方面,由于偶尔出现的错误的 XOFF
    控制符而中断的通信解锁,使其正常通信。

  • #### DC3 (19)

    Device Control 3,或者 XOFF(Transmission off,传输中断)。

    #### EM (25)

    End of Medium,已到介质末端,介质存储已满。

    EM
    用于,当数据存储到达串行存储介质末尾的时候,就像磁带或磁头滚动到介质末尾一样。其用于表述数据的逻辑终点,即不必非要是物理上的达到数据载体的末尾。

  • #### FS(28)

    File Separator,文件分隔符。FS
    是个很有意思的控制字符,它可以让我们看到 1960s
    年代的计算机是如何组织的。

    我们现在习惯于随机访问一些存储介质,比如 RAM、磁盘等,但是在设计
    ASCII
    编码的那个年代,大部分数据还是顺序的、串行的,而不是随机访问的。此处所说的串行,不仅仅指的是串行通信,还指的是顺序存储介质,比如穿孔卡片、纸带、磁带等。

    在串行通信的时代,设计这么一个用于表示文件分隔的控制字符,用于分割两个单独的文件,是一件很明智的事情。

  • #### GS(29)

    Group Separator,分组符。

    ASCII 定义控制字符的原因之一就是考虑到了数据存储。

    大部分情况下,数据库的建立都和表有关,表包含了多条记录。同一个表中的所有记录属于同一类型,不同的表中的记录属于不同的类型。

    而分组符 GS
    就是用来分隔串行数据存储系统中的不同的组。值得注意的是,当时还没有使用
    Excel 表格,ASCII 时代的人把它叫做组。

  • #### RS(30)

    Record Separator,记录分隔符,用于分隔一个组或表中的多条记录。

  • #### US(31)

    Unit Separator,单元分隔符。

    在 ASCII
    定义中,数据库中所存储的最小的数据项叫做单元(Unit)。而现在我们称其字段(Field)。单元分隔符
    US 用于分割串行数据存储环境下的不同单元。

    现在的数据库实现都要求大部分类型都拥有固定的长度,尽管有时候可能用不到,但是对于每一个字段,却都要分配足够大的空间,用于存放最大可能的数据。

    这种做法的弊端就是占用了大量的存储空间,而 US
    控制符允许字段具有可变的长度。在 1960s 年代,数据存储空间很有限,用
    US 将不同单元分隔开,能节省很多空间。

  • #### DEL (127)

    Delete,删除。

    有人也许会问,为何 ASCII 编码中其它控制字符的值都很小(即 0~31),而
    DEL 的值却很大呢(为 127)?

    这是由于这个特殊的字符是为纸带而定义的。在那个年代,绝大多数的纸带都是用7个孔洞去编码数据的。而
    127 这个值所对应的二进制值为111 1111(所有 7 个比特位都是1),将 DEL
    用在现存的纸带上时,所有的洞就都被穿孔了,就把已经存在的数据都擦除掉了,就起到了删除的作用。

判断题:

C语言使用的就是 ASCII 编码,字符在存储时会转换成对应的 ASCII
码值,在读取时也是根据 ASCII 码找到对应的字符。(X)

答:C语言有时候使用 ASCII
编码,有时候却不是,而是使用后面两节中即将讲到的 GBK 编码和 Unicode
字符集。

 

**ASCII字符集中的功能/控制字符**

 

 

过滤ASCII码中的不可见字符  

上面所说的“不可见字符”,其实属于ascii码中的控制字符,它们是0到31、以及127,分别代表什么可查询ascii码表。

 在展示页面前,将文字中的控制字符改为空格(ascii 32)

public static String filter(String content){
if (content != null && content.length() > 0) {
char[] contentCharArr = content.toCharArray();
for (int i = 0; i < contentCharArr.length; i++) {
if (contentCharArr[i] < 0x20 || contentCharArr[i] == 0x7F) {
contentCharArr[i] = 0x20;
}
}
return new String(contentCharArr);
}
return "";
}

 

 

 

其具体每个控制字符的含义,详解介绍如下:

 

【ASCII中的Function/Control Code功能字符的详细含义】

 

 

 

0 – NUL – NULl 字符/空字符

 

ASCII字符集中的空字符,NULL,起初本意可以看作为NOP(中文意为空操作,就是啥都不做的意思),此位置可以忽略一个字符。

 

之所以有这个空字符,主要是用于计算机早期的记录信息的纸带,此处留个NUL字符,意思是先占这个位置,以待后用,比如你哪天想起来了,在这个位置在放一个别的啥字符之类的。

 

后来呢,NUL字符被用于C语言中,字符串的终结符,当一个字符串中间出现NUL /
NULL,代码里面表现为,的时候,就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串,多长都行,当然只要你内存放得下,然后最后加一个, 即空字符,意思是当前字符串到此结束。

 

 

 

1 – SOH – Start
Of Heading 标题开始
 

如果信息沟通交流主要以命令和消息的形式的话,SOH就可以用于标记每个消息的开始。

 

1963年,最开始ASCII标准中,把此字符定义为Start of
Message,后来又改为现在的Start Of Heading。

 

现在,这个SOH常见于主从(master-slave)模式的RS232的通信中,一个主设备,以SOH开头,和从设备进行通信。这样方便从设备在数据传输出现错误的时候,在下一次通信之前,去实现重新同步(resynchronize)。如果没有一个清晰的类似于SOH这样的标记,去标记每个命令的起始或开头的话,那么重新同步,就很难实现了。

 

 

 

2 – STX – Start Of Text 文本开始

 

3 – ETX – End Of Text 文本结束

 

通过某种通讯协议去传输的一个数据(包),称为一帧的话,常会包含一个帧头,包含了寻址信息,即你是要发给谁,要发送到目的地是哪里,其后跟着真正要发送的数据内容。

 

而STX,就用于标记这个数据内容的开始。接下来是要传输的数据,最后是ETX,表明数据的结束。

 

其中,中间具体传输的数据内容,ASCII规范并没有去定义,其和你所用的传输协议,具体自己要传什么数据有关。

 

帧头

数据或文本内容

SOH(表明帧头开始)

。。。。(帧头信息,比如包含了目的地址,表明你发送给谁等等)

STX(表明数据开始)

。。。(真正要传输的数据)

ETX(表明数据结束)

 

 

 

 

 

 

不过其中有趣的是,1963年,ASCII标准最初版本的时候,把现在的STX叫做EOA(End
Of Address),ETX叫做(End Of
Message)。这是因为,最早的时候,一个消息中,总是包含一个开始符和一个终止符。现在的新的定义,使得可以去发送一个固定长度的命令,而只用一个SOH表明帧头开始即可,而不需要再加上一个命令终止符或帧头结束符。

 

 

 

总结一下:

 

一般发送一个消息,包含了一个帧头和后面真正要传的数据。

 

而对于帧头,属于控制类的信息,这部分之前属于命令,后面的真实要传的数据属于数据。即消息=帧头+数据。

 

而之前的命令都要有个开始符和结束符,这样就是:

 

消息
= 帧头
+ 要传的数据

 

= 帧头开始+帧头信息+帧头结束 
+ 要传的数据

 

而现在新的定义,使得只需要:

 

消息
= 帧头 +要传的数据

 

= SOH(表明帧头开始)+帧头信息 
+ 要传的数据

 

= SOH(表明帧头开始)+帧头信息 

  • STX + 数据内容+ETX

 

就可以少用一个帧头结束符。

 

 

 

而如今,在很多协议中,也常见到,一个固定长度的帧头,后面紧接着就是数据了,而没有所谓的帧头结束符之类的东西去区分帧头和数据。

 

 

 

4 – EOT – End Of Transmission 传输结束

 

5 – ENQ – ENQuiry 请求

 

6 – ACK – ACKnowledgment 回应/响应

 

7 – BEL – [audible] BELl

 

 

 

在ASCII字符集中,BEL,是个比较有意思的东东。因为其原先本意不是用来数据编码的,于此相反,ASCII中的其他字符,都是用于字符编码(即用什么字符,代表什么含义)或者起到控制设备的作用。BEL用一个可以听得见的声音,来吸引人们的注意,其原打算即用于计算机也用于一些设备,比如打印机等。C语言里面也支持此BEL,用a来实现这个响铃。

 

 

 

8 – BS – BackSpace 退格键

 

退格键的功能,随着时间变化,意义也变得不同了。

 

起初,意思是,在打印机和电传打字机上,往回移动一格光标,以起到强调该字符的作用。比如你想要打印一个a,然后加上退格键后,就成了aBS^。在机械类打字机上,此方法能够起到实际的强调字符的作用,但是对于后来的CTR下时期来说,就无法起到对应效果了。

 

而现代所用的退格键,不仅仅表示光标往回移动了一格,同时也删除了移动后该位置的字符。在C语言中,退格键可以用b表示。

 

 

 

9 – HT – Horizontal Tab 水平制表符

 

ASCII中的HT控制符的作用是用于布局的。

 

其控制输出设备前进到下一个表格去处理。而制表符Table/Tab的宽度也是灵活不固定的,只不过,多数设备上,制表符Tab的宽度都预定义为8。水平制表符HT不仅能减少数据输入者的工作量,对于格式化好的文字来说,还能够减少存储空间,因为一个Tab键,就代替了8个空格,所以说省空间。

 

对于省空间的优点,我们现在来看,可能会觉得可笑,因为现在存储空间已足够大,一般来说根本不会需要去省那么点可怜的存储空间,但是实际上在计算机刚发明的时候,存储空间(主要指的是内存)极其有限也极其昂贵,而且像ZIP等压缩方法也还没发明呢,所以对于当时来说,对于存储空间,那是能够省一点是一点,省任何一点,都是好的,也都是不容易的,省空间就是省钱啊。

 

C语言中,用t表示制表符。

 

 

 

10 – LF – Line Feed 换行

 

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 – Vertical Tab 垂直制表符

垂直制表符,类似于水平制表符Tab,目的是为了减少布局中的工作,同时也减少了格式化字符时所需要存储字符的空间。VT控制码用于跳到下一个标记行。说实话,还真没看到有些地方需要用这个VT呢,因为一般在换行的时候,都是用LF代替VT了。

 

12 – FF – Form Feed
换页

设计换页键,是用来控制打印机行为的。当打印机收到此键码的时候,打印机移动到下一页。不同的设备的终端对此控制码所表现的行为各不同。有些会去清除屏幕,而其他有的只是显示^L字符或者是只是新换一行而已。Shell脚本程序Bash和Tcsh的实现方式是,把FF看作是一个清除屏幕的命令。C语言程序中用f表示FF(换页)。

 

13 – CR – Carriage return 机器的滑动部分/底座
返回 -> 回车

CR回车的原意是让打印头回到左边界,并没有移动到下一行。

随着时间流逝,后来人把CR的意思弄成了Enter键,用于示意输入完毕。在数据以屏幕显示的情况下,人们在Enter的同时,也希望把光标移动到下一行。因此C语言和Unix操作系统,重新定义了LF的意思,使其表示为移动到下一行。当输入CR去存储数据的时候,软件也常常隐式地将其转换为LF。

 

14 – SO – Shift Out 不用切换

15 – SI – Shift In
启用切换

早在1960s年代,定义ASCII字符集的人,就已经懂得了,设计字符集不单单可以用于英文字符集,也要能应用于外文字符集,是很重要的。

定义Shift In 和Shift Out的含义,即考虑到了此点。

最开始,其意为在西里尔语和拉丁语之间切换。西里尔ASCII定义中,KOI-7用到了Shift字符。拉丁语用Shift去改变打印机的字体。在此种用途中,SO用于产生双倍宽度的字符,而用SI打印压缩的字体。

 

16 – DLE – Data Link Escape 数据链路转义

有时候,我们需要在正在进行的通信过程中去发送一些控制字符。但是,总有一些情况下,这些控制字符却被看成了普通的数据流,而没有起到对应的控制效果。而ASCII标准中,定义DLE来解决这类问题。

如果数据流中检测到了DLE,数据接收端则对其后面接下来的数据流中的字符,另作处理。而关于具体如何处理这些字符,ASCII规范中则没有具体定义,而只是弄了个DLE去打断正常数据的处理,告诉接下来的数据,要特殊对待。根据Modem中的Hayes通信协议DLE定义为“无声+++无声”。以我的观点,这样可能会更好:如果Hayes协议没有把DLE处理为嵌入通讯的无声状态,那样就符合现存的标准了。然而Hayes的开发者却觉得+++用的频率要远高于原始的DLE,所以才这么定义了。

 

17 – DC1 – Device Control 1 / XON – Transmission on

这个ASCII控制字符尽管原先定义为DC1,
但是现在常表示为XON,用于串行通信中的软件流控制。其主要作用为,在通信被控制码XOFF中断之后,重新开始信息传输。用过串行终端的人应该还记得,当有时候数据出错了,按Ctrl+Q(等价于XON)有时候可以起到重新传输的效果。这是因为,此Ctrl+Q键盘序列实际上就是产生XON控制码,其可以将那些由于终端或者主机方面,由于偶尔出现的错误的XOFF控制码而中断的通信解锁,使其正常通信。

 

18 – DC2 – Device Control 2

19 – DC3 – Device Control 3 / XOFF – Transmission off 传输中断

20 – DC4 – Device Control 4

21 – NAK – Negative AcKnowledgment 负面响应-> 无响应, 非正常响应

22 – SYN – SYNchronous idle

23 – ETB – End of Transmission Block 块传输中止

24 – CAN – CANcel 取消

25 – EM – End of Medium
已到介质末端,介质存储已满

EM用于,当数据存储到达串行存储介质末尾的时候,就像磁带或磁头滚动到介质末尾一样。其用于表述数据的逻辑终点,即不必非要是物理上的达到数据载体的末尾。

 

26 – SUB – SUBstitute character替补/替换

27 – ESC – ESCape 逃离/取消

字符Escape,是ASCII标准的首创的,由Bob
Bemer提议的。用于开始一段控制码的扩展字符。如此,即可以不必将所有可能想得到的字符都放到ASCII标准中了。因为,新的技术可能需要新的控制命令,而ESC可以用作这些字符命令的起始标志。ESC广泛用于打印机和终端,去控制设备设置,比如字体,字符位置和颜色等等。如果最开始的ASCII标准中,没有定义ESC,估计ASCII标准早就被其他标准所替代了,因为其没有包含这些新出现的字符,所以肯定会有其他新的标准出现,用于表示这些字符的。即,ESC给开发者提供了,可以根据需要而定义新含义的字符的可能。

 

28 – FS – File Separator 文件分隔符

文件分隔符是个很有意思的控制字符,因为其可以让我们看到1960s年代的时候,计算机技术是如何组织的。我们现在,习惯于随即访问一些存储介质,比如RAM,磁盘,但是在定义ASCII标准的那个年代,大部分数据还是顺序的,串行的,而不是随机访问的。此处所说的串行的,不仅仅指的是串行通信,还指的是顺序存储介质,比如穿孔卡片,纸带,磁带等。在串行通信的时代,设计这么一个用于表示文件分隔符的控制字符,用于分割两个单独的文件,是一件很明智的事情。而FS的原因就在于此。

 

29 – GS – Group Separator分组符

ASCII定义控制字符的原因中,其中一条就是考虑到了数据存储方面的情况。大部分情况下,数据库的建立,都和表有关,包含了对应的记录。同一个表中的所有的记录,属于同一类型。不同的表中的记录,属于对应的不同的类型。而分组符GS就是用来分隔串行数据存储系统中的不同的组。值得注意的是,当时还没有使用word的表格,当时ASCII时代的人,把他叫做组。

 

30 – RS – Record Separator记录分隔符

记录分隔符RS用于分隔在一个组或表内的多个记录。

 

31 – US – Unit Separator 单元分隔符

在ASCII定义中,在数据库中所存储的,最小的数据项,叫做Unit单元。而现在我们称其field域。单元分隔符US用于分割串行数据存储环境下的不同的域。

现在大部分的数据库实现,要求大部分类型都拥有固定的长度。

尽管大部分时候可能用不到,但是对于每一个域,却都要分配足够大的空间,用于存放最大可能的成员变量。这样的做法,占用了大量的存储空间,而US控制码允许域具有可变的长度。在1960s年代,数据存储空间很有限,用US这个单元分隔符,将不同单元分隔开,这样就可以实现更高效地存储那些宝贵的数据。另一方面,串行存储的存储效率,远低于RAM和磁盘中所实现的表格存储。我个人无法想象,如果现在的数据,还是存储在自带或者带滚轮的磁带上,会是何种景象。

 

32 – SP – White SPace 空格键

也许你会争论说,空格键是否真的能算是一个控制字符?因为现在在普通文字中使用空格键是如此常见。

但是,既然水平制表符和退格键在ASCII中,都被叫做控制字符了,那么我觉得也很自然地,可以把空格键(向前的空格)也叫做控制字符,毕竟,其本身并不代表一个真正的可见的字符,而仅仅只是很常用于输出设备,用于处理位置前向移动一格,清除当前位置的内容而已。在很多程序中,比如字符处理程序,白空格同样可能从导致行尾转到下一行行首,而网络浏览器将多个空格组合成单个空格输出。

所以,这更加坚定了我的想法,觉得完全可以把空格看成是一个控制字符,而不仅仅是一个很独特的普通字符。

 

127 – DEL – DELete
删除

有人也许会问,为何ASCII字符集中的控制字符的值都是很小的,即0-32,而DEL控制字符的值却很大,是127。这是由于这个特殊的字符是为纸带而定义的。而在那个时候,绝大多数的纸带,都是用7个孔洞去编码数据的。而127这个值所对应的二进制值为111
1111b,表示所有7个比特位都是高,所以,将DEL用在现存的纸带上时,所有的洞就都被穿孔了,就把已经存在的数据都擦出掉了,就起到了对应的删除的作用了。

 

【各种字符的标准的读法/叫法】

常见ASCII字符,以及其他非常见的字符,Unicode中的字符,其他特殊字符等等,这些字符的英文叫法,可以去Unicode官方找到:

比如:

ASCII字符/字母的叫法/读法
如何读

  1. C0 Control and Basic Latin Range:0000-007F

2.Alphabetic Presentation Forms Range:FB00-FB4F

 

3. CJK Compatibility
Forms

 

4.Fullwidth ASCII
Punctuation

 

【引用】

1.C0 and C1 control codes

 

  1. Control Character

 

3.
ASCII character
map

 

4.
百度百科:ASCII

 

5. ASCII编码表

 

 

 

 

 

 

 

ASCII码大致可以分作三部分组成。

  • 第一部分:ASCII非打印控制字符表

    ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备。例如,12代表换页/新页功能。此命令指示打印机跳到下一页的开头。(参详ASCII码表中0-31)

  • 第二部分:ASCII打印字符

    数字 32–126
分配给了能在键盘上找到的字符,当您查看或打印文档时就会出现。数字127代表
DELETE 命令。(参详ASCII码表中32-127)

    ASCII码表 0-127

    永利国际网站 1

  • 第三部分:扩展ASCII打印字符

    扩展的ASCII字符满足了对更多字符的需求。扩展的ASCII包含ASCII中已有的128个字符(数字0–32显示在下图中),又增加了128个字符,总共是256个。即使有了这些更多的字符,许多语言还是包含无法压缩到256个字符中的符号。因此,出现了一些ASCII的变体来囊括地区性字符和符号。例如,许多软件程序把ASCII表(又称作ISO8859-1)用于北美、西欧、澳大利亚和非洲的语言。

    

    永利国际网站 2

 

 

 

 

Vim里常见的几个不可见字符:
^@ = 0x00 Null值
^H = 0x08 退格
^I = 0x09 水平制表
^J = 0x0A 换行
^M = 0x0D 回车

 

去掉^M回车: 

:%s/^M//g #  vi中将^M替换成回车。 
$ sed -e ‘s/^M//g’ myfile.txt
 #直接操作文件
注意:这里的“^M”要使用“CTRL-V CTRL-M”生成,而不是直接键入“^M”。

 

去掉^@: 

sed -r ‘s/x0//g’ file>file1

 

 

 

【什么是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

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(删除)

?*

 

注(*):

1. 转义字符:即在C语言中或其他地方如何表示。

2. 用键盘输入控制字符:其中,32是空格键,都不需要加Ctrl键,即可直接输入。

3.127是Delete键,除了可以用键盘上的删除键输入,也可以用Ctrl+?输入。

4. 可以通过 “Ctrl+对应按键”实现上述控制字符的输入, 你可能遇到的一些,比如:用Ctrl+V输入SYNC,Ctrl+M输入Enter(当然也可以直接用Enter键,但是在Windows下面,其可能会发送两个字符:CR和LF),Ctrl+Q输入XON,Ctrl+S输入XOFF等等。

 

^

 

Function/Control Code/Character in ASCII

Version: 2011-02-15

Author: green-waste (at) 163.com

 

【什么是 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+ 对应按键 ” 实现上述控制字符的输入 ,  你可能遇到的一些,比如 : 用 Ctrl+V 输入 SYNC , Ctrl+M 输入Enter (当然也可以直接用 Enter 键,但是在 Windows 下面,其可能会发送两个字符: CR 和 LF ), Ctrl+Q 输入 XON ,Ctrl+S 输入 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 (表明数据结束)

 

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website