系统工作得好好的, 但某次却异常, 花了十多分钟, 才定位出是加载文件中包含了不可见字符导致的。 最后解决方法是: 增强系统的兼容性。
今天我们来聊聊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控制字符和ASCII可显示字符
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可显示字符
 
    
  |  
    
  |  
    
  |