ascii控制字元(不可見字元)和可列印字元(可見字元)------浪費15分鐘的一次經歷
系統工作得好好的, 但某次卻異常, 花了十多分鐘, 才定位出是載入檔案中包含了不可見字元導致的。 最後解決方法是: 增強系統的相容性。
今天我們來聊聊ascii控制字元(不可見字元)和可列印字元(可見字元), 以後碰到類似問題就很敏感了。
網上有人說, 可以用printf來判斷字元是否是可列印字元, 這不是扯淡麼? 我在VC++6.0下試了一下, 用printf能打印出很多不可見字元, 當然, 這可能和IDE相關。
ASCII字符集由95個可列印字元(0x20-0x7E)和33個控制字元(0x00-0x1F,0x7F)組成。可列印字元用於顯示在輸出裝置上,例如熒屏或者列印紙上,控制字元用於向計算機發出一些特殊指令,例如0x07會讓計算機發出嗶的一聲,0x00通常用於指示字串的結束,0x0D和0x0A用於指示印表機的列印針頭退到行首(回車)並移到下一行(換行).
看個程式:
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { int i = 0; int count = 0; for(i = 0; i < 256; i++) { int ret = isprint(i); if(ret != 0) { count++; printf("%d:%c\n", i, i); } } printf("count is %d\n", count); return 0; }
結果:
32:
33:!
34:"
35:#
36:$
37:%
38:&
39:'
40:(
41:)
42:*
43:+
44:,
45:-
46:.
47:/
48:0
49:1
50:2
51:3
52:4
53:5
54:6
55:7
56:8
57:9
58::
59:;
60:<
61:=
62:>
63:?
64:@
65:A
66:B
67:C
68:D
69:E
70:F
71:G
72:H
73:I
74:J
75:K
76:L
77:M
78:N
79:O
80:P
81:Q
82:R
83:S
84:T
85:U
86:V
87:W
88:X
89:Y
90:Z
91:[
92:\
93:]
94:^
95:_
96:`
97:a
98:b
99:c
100:d
101:e
102:f
103:g
104:h
105:i
106:j
107:k
108:l
109:m
110:n
111:o
112:p
113:q
114:r
115:s
116:t
117:u
118:v
119:w
120:x
121:y
122:z
123:{
124:|
125:}
126:~
count is 95
看個表格結束本文:
ASCII控制字元
二進位制 | 十進位制 | 十六進位制 | 縮寫 | 可以顯示的表示法 | 名稱/意義 |
---|---|---|---|---|---|
0000 0000 | 0 | 00 | NUL | ␀ | 空字元(Null) |
0000 0001 | 1 | 01 | SOH | ␁ | 標題開始 |
0000 0010 | 2 | 02 | STX | ␂ | 本文開始 |
0000 0011 | 3 | 03 | ETX | ␃ | 本文結束 |
0000 0100 | 4 | 04 | EOT | ␄ | 傳輸結束 |
0000 0101 | 5 | 05 | ENQ | ␅ | 請求 |
0000 0110 | 6 | 06 | ACK | ␆ | 確認迴應 |
0000 0111 | 7 | 07 | BEL | ␇ | 響鈴 |
0000 1000 | 8 | 08 | BS | ␈ | 退格 |
0000 1001 | 9 | 09 | HT | ␉ | 水平定位符號 |
0000 1010 | 10 | 0A | LF | ␊ | 換行鍵 |
0000 1011 | 11 | 0B | VT | ␋ | 垂直定位符號 |
0000 1100 | 12 | 0C | FF | ␌ | 換頁鍵 |
0000 1101 | 13 | 0D | CR | ␍ | 歸位鍵 |
0000 1110 | 14 | 0E | SO | ␎ | 取消變換(Shift out) |
0000 1111 | 15 | 0F | SI | ␏ | 啟用變換(Shift in) |
0001 0000 | 16 | 10 | DLE | ␐ | 跳出資料通訊 |
0001 0001 | 17 | 11 | DC1 | ␑ | 裝置控制一(XON 啟用軟體速度控制) |
0001 0010 | 18 | 12 | DC2 | ␒ | 裝置控制二 |
0001 0011 | 19 | 13 | DC3 | ␓ | 裝置控制三(XOFF 停用軟體速度控制) |
0001 0100 | 20 | 14 | DC4 | ␔ | 裝置控制四 |
0001 0101 | 21 | 15 | NAK | ␕ | 確認失敗迴應 |
0001 0110 | 22 | 16 | SYN | ␖ | 同步用暫停 |
0001 0111 | 23 | 17 | ETB | ␗ | 區塊傳輸結束 |
0001 1000 | 24 | 18 | CAN | ␘ | 取消 |
0001 1001 | 25 | 19 | EM | ␙ | 連線介質中斷 |
0001 1010 | 26 | 1A | SUB | ␚ | 替換 |
0001 1011 | 27 | 1B | ESC | ␛ | 跳出 |
0001 1100 | 28 | 1C | FS | ␜ | 檔案分割符 |
0001 1101 | 29 | 1D | GS | ␝ | 組群分隔符 |
0001 1110 | 30 | 1E | RS | ␞ | 記錄分隔符 |
0001 1111 | 31 | 1F | US | ␟ | 單元分隔符 |
0111 1111 | 127 | 7F | DEL | ␡ | 刪除 |
ASCII可顯示字元
|
|
|