第1个回答 推荐于2017-09-29
汉字GBK编码 采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。
全部编码分为三大部分:汉字区,图形符号区,用户自定义区
1. 汉字区。包括:
a. GB 2312 汉字区。即 GBK/2: B0A1-F7FE。收录 GB 2312 汉字 6763 个,按原顺序排列。
b. GB 13000.1 扩充汉字区。包括:
(1) GBK/3: 8140-A0FE。收录 GB 13000.1 中的 CJK 汉字 6080 个。
(2) GBK/4: AA40-FEA0。收录 CJK 汉字和增补的汉字 8160 个。CJK 汉字在前,按 UCS 代码大小排列;增补的汉字(包括部首和构件)在后,按《康熙字典》的页码/字位排列。
所以在判断汉字时,要采用两个字节同时检查才可以。
以下程序供参考
#include <stdio.h>
int main()
{
char str[100];
int i=0;
gets(str);
while ( str[i] )
{
unsigned char ch=str[i] ; //注意要定义为无符号
//先检查ch是否是字母:
if ( ( ch >='a' && ch<='z' ) || (ch>='A' && ch<='Z' ) )
{
i++;
continue ;
}
else
{
//再检查ch是否是数字:
if ( ch >='0' && ch <= '9' )
{
i++;
continue ;
}
else
{
//最后检查是否是汉字:(按GB 2312 汉字区检查,不考虑特殊汉字 B0A1-F7FE)
if ( ch >= 0xB0 && ch <= 0xF7 )
{
//继续检查下一个字符是否能组织成汉字
unsigned char ch1=str[i+1] ; //注意要定义为无符号
if ( ch1 >=0xA1 && ch1 <= 0xFE )
{
i+=2 ;
continue ;
}
}
}
}
printf("第%d位是乱码\n" , i+1 );
i++ ;
}
return 0;
}本回答被提问者采纳