1.8 字符编码 |
|
在涉及英文或数字等字符(字符串)显示程序设计及串口收发程序设计等内容时,需要熟悉标准的ASCII码表,表1-6列出了十六进制ASCII编码为0x00~0x7F(0~127)的字符ASCII码表,由该表可知:
① 数字字符‘0’~‘9’的ASCII编码为0x30~0x39,与数字0~9的差值为0x30,两者相互转换时可±0x30,或者直接±‘0’。
② 英文字符‘A’~‘Z’、‘a’~‘z’的编码为0x41~0x5A、0x61~0x7A,大小写转换时可±0x20。
③ 字符串的结束标识符为‘\0’,即表中编码为0x00(NUL或NULL)的非打印字符。
④ 常用的空格字符(SP/SPACE)的ASCII编码为0x20。
⑤ 在向串口发送字符串时,常以回车/换行符(CR/LF)为结束标志,回车符/换行符的ASCII码分别为0x0D、0x0A。
⑥ 表中前两行所列出的其他特殊控制字符(Control Characters)虽然多数已废止,但有部分控制字符名称仍应用于某些现代产品设计。
表1-6 ASCII码表(0x00~0x7F)
例如,某种射频读卡器(RFID)模块所设计的链路层协议以STX、ETX(文本起始符/结束符,Start of Text/End of Text)作为数据帧的起始标识符,不过该厂商将STX与ETX的编码定义为0x82与0x83。另外,表中的应答与非应答(ACK/NAK或称NACK)字符,其概念仍应用于全书所有有关I 2 C器件的程序设计,所不同的是I 2 C协议中的应答与非应答仅仅是一个脉冲位(0/1),而不再是一个字节编码。
在实际应用过程中,如果临时需要查询某些字符编码,包括中文字符编码,可先用记事本输入字符内容,然后用UltraEdit打开,切换到十六进制模式查看编码。
图1-5中显示了用记事本(NotePad)输入的字符(包括中文字符)以及在超级编辑器UltraEdit中查看的十六进制字符编码的效果,UltraEdit不仅显示了所输入英文数字等字符的ASCII编码(小于0x80),而且显示了所输入汉字的内码。例如,“8051单片机C语言程序设计”的编码为“ 38 30 35 31 B5 A5 C6 AC BB FA 43 D3 EF D1 D4 B3 CC D0 F2 C9 E8 BC C6”。图中除了用小方框标出的数字与英文半角字符“8、0、5、1、C”的编码以外,其他编码全部大于等于0xA0,这些编码每两字节(汉字内码)表示一个汉字,图中已用矩形框标出。8051虽然支持在源程序中直接使用中文字符串或中英文混合字符串,偶尔也会出现编译正常通过,但实际运行时却出现异常的情况,此时可考虑将中文字符串以编码(汉字内码)的方式提供。
图1-5 用NotePad与UltraEdit获取字符编码