ASCII碼字符集

爲什麼有ASCII碼

計算機存儲和傳輸的數據必須是二進制,也就是說所有的信息都要轉換成0和1表示。在兩臺通信設備之間通信的時候,比如要傳輸字符a,發送設備把a編碼爲0和1組成的序列,併發送出去,接口設備如何正確地的理解這個0和1序列呢?這就像兩個人之間對話一樣,如果兩個人使用的是不同的語言,那麼他們會存在溝通障礙。同樣的地,計算機設備之間也需要統一的編碼標準,把字符編碼爲統一的0和1序列,發送之前進行二進制編碼, 接收的設備只要按照相同的規則解析,就可以讀取出來信息了。統一的編碼方案成爲信息能夠正確存儲和傳輸的前提。

ASCII(American Standard Code for Information Interchange)美國信息交換標準代碼,它是對字母、數字、符號進行二進制編碼的標準。一個ASCII碼長度是一個字節,也就是8個bit,最高位是0作爲校驗位,其餘7位使用0和1進行組合,所以ASCII碼共有128個。這128個字符包含33個控制字符和95個可顯示字符。0-31以及127是控制字符,包含DEL刪除,BS退格,CR回車等。32-126是可顯示字符,其中32是回車,48-57是10個阿拉伯數字,65-90是26個大寫的英文字母,97-122是26個小寫的英文字母。

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倍。