为什么有ASCII码
计算机存储和传输的数据必须是二进制,也就是说所有的信息都要转换成0和1表示。在两台通信设备之间通信的时候,比如要传输字符a,发送设备把a编码为0和1组成的序列,并发送出去,接口设备如何正确地的理解这个0和1序列呢?这就像两个人之间对话一样,如果两个人使用的是不同的语言,那么他们会存在沟通障碍。同样的地,计算机设备之间也需要统一的编码标准,把字符编码为统一的0和1序列,发送之前进行二进制编码, 接收的设备只要按照相同的规则解析,就可以读取出来信息了。统一的编码方案成为信息能够正确存储和传输的前提。
ASCII码表格
127个ASCII字符和数字是一一对应的关系,表格中展示的为十进制表示,在计算机传输和存储中,会把他们转换为二进制,比如数字0的十进制表示为48,转换为二进制就是00110000,在不同的设备中互相传输的就是这个二进制序列。
ASCII值 | ASCII字符 | ASCII值 | ASCII字符 | ASCII值 | ASCII字符 | ASCII值 | ASCII字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
ASCII字符局限性
可以发现,ACSII字符最高位置0的情况下,最多表示128个字符,英文字符完全可以被编码,如果是其他语言,字符数量多于127个如何表示呢?一些国家对ASCII码做了扩展,让最高位也参与编码,这样ASCII码能表示的字符数量从128个上升到256个,这种编码ASCII也被成为扩展ASCII编码。
然而,扩展ASCII编码仍然有很大局限性,世界上有很多中语言文字,每种语言的字符数量不一,256个依然是不够用的。汉字的数量大约接近十万个,常用汉字大约六千个,如何实现汉字编码呢?此类情况,其他语言也是存在。每个国家都将自己的语言编码为某个标准,标准不统一,导致计算机设备在传输信息过程中出现乱码。Unicode编码的出现,它采用两个字节对接字符编码,理论上可以有256*256=65536个字符,解决了编码数量过少问题,同时,它也是通用的编码标准,避免了信息传输中乱码问题。
Unicode标准成为了国际认可的编码标准,但在推广过程中受到欧美国家的反对,他们的理由很简单,在ASCII编码体系下,他们字符编码仅仅需要一个字节,而Unicode采用了两个字节,存储空间占用直接变为两倍,同时他们所有的文本处理程序都需要重写,工作量很大,如果采用两个字节编码他们是无法接受的。互联网的普及强烈要求统一的编码格式,utf-8编码后来成为了通用编码方式。它采用变长编码,使用1-4个字节表示一个符号,根据符号的不同,变化字节长度。对于ASCII码,它在utf-8中的编码保持不变,仍是一个字节,原来处理ASCII字符的程序几乎不需要改变,可以继续使用。但对于中文来说,中文字符在utf-8中占用3个字节,在Unicode标准中需要两个字节,使用utf-8编码后,中文信息传输占用的流量变为1.5倍。