其实判断汉字的代码很简单,简单到只有一行就可以了,但不理解汉字编码的基础,这一行代码却万万无法理解。常用的字符编码有以下三种:1、ASCII只支持英文,全部为8位2、DBCS支持英文和中文,但中文需要两个字节(16位)3、UNICODE支持英文和中文,英文和中文都需要两个字节ASCII是DOS时代的,无法支持中文。DBCS是Win9x支持的字符集。UNICODE是win2k和xp支持的字符集。而汉字的编码目前有GB2312-1980和GB18030-2000,GB2312就是DBCS类型的汉字编码,GB18030就是UNICODE的汉字编码,当然GB18030兼容GB2312,也就是说GB18030也支持DBCS的字符处理方式。虽然GB18030是2000年后强制执行的国家标准,但目前使用最多的还是GB2312编码,而且GB2312也足够处理你所用到的汉字了。还有GBK编码是GB2312的增强版。这里我仅支持GB2312。由于GB2312是中国大陆制定的标准,所以繁体中文并不在GB2312的编码中,如果你的程序需要支持繁体中文,则还需要处理Big5编码。其实也很简单。下面说一下在C中如何处理GB2312编码的汉字。以VC6.0为例,如果声明变量的类型为wchar_t则是UNICODE编码,如果是char则是DBCS编码比如我的一个函数声明是:voidJustify(HDChdc,PTSTRpText,RECT*prc,intiAlign)其中的pText是PTSTR类型,PTSTR在WINNT.H中有两个定义(WINNT.H中的这段代码我删掉了中间无关的部分)#ifdefUNICODEtypedefLPWSTRPTSTR,LPTSTR;//如果是UNICODE编码,则定义PTSTR为LPWSTR类型#elsetypedefLPSTRPTSTR,LPTSTR;//如果是不是UNICODE编码,则定义PTSTR为LPSTR类型#endifLPSTR定义为CHAR的指针LPSWSTR定义为WCHAR的指针CHAR定义为char类型WCHAR定义为wchar_t类型而wchar_t定义为unsignedshort类型,它是16位,两个字节,无符号短整数是UNICODE还是非UNICODE取决于你的编译选项,如果在[工程]-[选项]-[C/C++]的[预处理程序定义]中填入了_UNICODE,那么程序会用wchar_t指针来定义LPSTR,如果没有_UNICODE,那么程序会用char指针来定义LPSTR,这样带来的区别就是,你接受到的pText中的字节内容是不一样的,[i服了you]这个字串如果在没有定义_UNICODE的情况下,是8个字节,而在定义了_UNICODE的情况下是12个字节。反映到程序中就是,如果没有定义_UNICODE,那么就要把英文字符当成1个字节来处理,而汉字字符的编码是采用GB2312编码规范来的;如果定义了_UNICODE,那么英文字符要当成2个字节来处理,而汉字字符的编码是采用UNICODE编码来的。举例来说,win98不采用UNICODE编码而采用的是DBCS编码,为了让我的程序既可以在XP下运行又可以在Win98下运行,我没有定义_UNICODE。这样我的程序代码就要把字符串当成DBCS编码来处理,也就是英文字符是1个字节,中文字符是2个字节,中文编码采用GB2312编码。用Justify来说明:我给pText传递来[你]这个汉字,那么pText应该有两个字节来存放[你]这个字,设置段点来读一下pText的内容。voidJustify(HDChdc,PTSTRpText,RECT*prc,intiAlign){staticTCHARszText[]={TEXT(你)};pText=szText;}设断调试会发现*pText=-60,怎么会这样呢,原因是没有按unsignedchar来转换*pText的值,修改代码如下:voidJustify(HDChdc,PTSTRpText,RECT*prc,intiAlign){staticTCHARszText[]={TEXT(你)};unsignedcharsqChar[20];//这个变量就是为了强制转换类型用的pText=szText;sqChar[0]=*pText;sqChar[1]=*(pText+1);}这时下断查看sqChar[0]=196,sqChar[1]=227就对了,为什么呢,因为它和GB2312的编码是一样的。GB2312-80编码的编码范围是高位0xa1-0xfe,低位是0xa1-0xfe,其中汉字范围为0xb0a1和0xf7fe,如果只是简单地判断汉字,则只要查看高字节是否大于等于0xa1就可以了,还有就是,全角字符的高字节统统等于0xa3,所以很容易可以区别出全角字符来。如果你希望你的程序能支持到GB18030,那么就去找GB18030的规范来看看。网上有很多判断汉字的说法,你只要记住,你要支持的编码是哪个?GB2312、GBK、GB18030?每个编码有自己的编码范围或者规范,网上之所以有不同的说法,正是因为他们互相说的不是同一种编码方式。我这里说的是GB2312的编码,如果你的程序要编译成支持UNICODE的话,那么这段代码就要修改成对应UNICODE规范的代码了。附简单的测试汉字、全角字符、英文的程序://test.c//源代码作者:夏克sequh@126.com//新建Win32Application工程,把test.c加入,运行,试着修改szText的值,来观察代码效果#includewindows.hintWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){staticTCHARszText[]={TEXT(i服,了。uy)};PTSTRpText;inti;unsignedcharsqChar[20];pText=szText;while(*pText!='\0'){i=IsGB(pText);switch(i){case0:pText++;MessageBox(NULL,TEXT(发现数字、英文字符或英文标点),TEXT(Hello),0);break;case1:pText++;pText++;MessageBox(NULL,TEXT(发现全角字符),TEXT(Hello),0);break;case2:pText++;pText++;MessageBox(NULL,TEXT(发现汉字),TEXT(Hello),0);break;}}return0;}intIsGB(PTSTRpText){unsignedcharsqChar[20];sqChar[0]=*pText;if(sqChar[0]=0xa1)if(sqChar[0]==0xa3)return1;//全角字符elsereturn2;//汉字elsereturn0;//英文、数字、英文标点}