目前,我们接触的汉字编码主要包括GBK和GB2312。其中,GB2312又称国标码,它是一个简化字的编码规范,也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。而GBK是GB2312的扩展,是向上兼容的,GB2312中的汉字的编码与GBK中汉字的相同,只不过GBK中还包含繁体字的编码。GBK中每个汉字仍然占用两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。因此,下面的代码也是在使用GB2312或GBK编码的环境下测试通过。
1 //全角转半角 2 void sbc_to_dbc(char *sbc, char *dbc) 3 { 4 for(; *sbc; ++sbc) 5 { 6 if((*sbc & 0xff) == 0xA1 && (*(sbc + 1) & 0xff) == 0xA1) //全角空格 7 { 8 *dbc++ = 0x20; 9 ++sbc; 10 } 11 else if((*sbc & 0xff) == 0xA3 && (*(sbc + 1) & 0xff) >= 0xA1 && (*(sbc + 1) & 0xff) <= 0xFE) //ASCII码中其它可显示字符 12 *dbc++ = *++sbc - 0x80; 13 else 14 { 15 if(*sbc < 0) //如果是中文字符,则拷贝两个字节 16 *dbc++ = *sbc++; 17 *dbc++ = *sbc; 18 } 19 } 20 *dbc = 0; 21 } 22 23 //半角转全角 24 void dbc_to_sbc(char *dbc, char *sbc) 25 { 26 for(; *dbc; ++dbc) 27 { 28 if((*dbc & 0xff) == 0x20) //半角空格 29 { 30 *sbc++ = 0xA1; 31 *sbc++ = 0xA1; 32 } 33 else if((*dbc & 0xff) >= 0x21 && (*dbc & 0xff) <= 0x7E) 34 { 35 *sbc++ = 0xA3; 36 *sbc++ = *dbc + 0x80; 37 } 38 else 39 { 40 if(*dbc < 0) //如果是中文字符,则拷贝两个字节 41 *sbc++ = *dbc++; 42 *sbc++ = *dbc; 43 } 44 } 45 *sbc = 0; 46 }