user-0 提问: 这样判断有缺陷吗？

回复:
user: user-1
content: #include <stdio.h> #include <locale.h> int HZwtail(char *hz,int p) {//返回0：非汉字|1：汉字前半个字节|2：汉字后半个字节     int s,i;     unsigned int c;      if (p<1) return 0;     s=0;     for (i=0;i<=p;i++) {         c=(unsigned)(hz[i]);         if (c==0) return 0;         switch (s) {         case 0:             if (c>0x80u)                 s=1;             else                 s=0;             break;         case 1:             if (c>=0x40u)                 s=2;             else                 s=0;             break;         case 2:             if (c>0x80u)                 s=1;             else                 s=0;             break;         }     }     return s;    //GBK汉字内码范围    //81-A0, 40-7E 80-FE    //AA-AF, 40-7E 80-A0    //B0-D6, 40-7E 80-FE    //D7   , 40-7E 80-F9    //D8-F7, 40-7E 80-FE    //F8-FE, 40-7E 80-A0  //if((((0x81u<=q && q<=0xA0u) || (0xB0u<=q && q<=0xD6u) || (0xD8u<=q && q<=0xF7u)) && ((0x40u<=w && w<=0x7Eu) || (0x80u<=w && w<=0xFEu)))  //|| (((0xAAu<=q && q<=0xAFu) || (0xF8u<=q && q<=0xFEu))                           && ((0x40u<=w && w<=0x7Eu) || (0x80u<=w && w<=0xA0u)))  //|| (              q==0xD7u                                                       && ((0x40u<=w && w<=0x7Eu) || (0x80u<=w && w<=0xF9u)))) //  if (q>0x80u && w>=0x40u) //      i=i+2; //  else //      i=i+1; } int main() {     setlocale(LC_ALL,"chs");     char hzstr[]="a汉字0啊12";     int i;     printf("%s\n",hzstr);     for (i=0;i<11;i++) {         printf("%d",HZwtail(hzstr,i));     }     printf("\n");     return 0; } //a汉字0啊12 //01212012000 //

user: user-2
content: 更准确的话应该需要是第第一个字节为 0xA0-0xFF 这一部分

user: user-3
content: 不可以的。 需要判断第一个连续的汉字的起始位置，然后从偶数截断。 碰到非汉字字符，重置起始位置。 你还需要考虑显示边界的问题，如果显示 80 列字符，那么只能从 80或者79 截断。 不能让汉字显示半边的。   我们早年做的是从网络接受字符串，显示在点阵的液晶屏上，可以一个一个的判断。

user: user-4
content: char 的取值范围是 -127~+127,不可能出现 0x80. 应该这样比较，使用 unsigned char 。    if(（（unsigned char） *(data + 15) ）> 0x80)   这种方式，可以比较、查找 GB2312 编码的汉字，这种编码的汉字，使用两个字节都，大于0x80,这样的汉字有5、6千个。  更多、更大范围的汉字，使用GBK编码（兼容GB2312），这样的汉字有几万个，这样的汉字，一个字节有可能小于0x80.  所有判断是否为汉字，不是这么简单的一句与 0x80进行比较的，要同时考虑多个字节。

user: user-5
content: lz是打算将 data 第15个字符之后的所有汉字都拷贝到 buf 中么？

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:仅供参考：integer proc HZwtail(integer p)     integer s,i,c      if p<1         return(0)     endif     s=0     for i=1 to p         c=CurrChar(i)         case s         when 0             if c>0x80                 s=1             else                 s=0             endif         when 1             if c>=0x40                 s=2             else                 s=0             endif         when 2             if c>0x80                 s=1             else                 s=0             endif         endcase     endfor     return(s)    //GBK汉字内码范围    //81-A0, 40-7E 80-FE    //AA-AF, 40-7E 80-A0    //B0-D6, 40-7E 80-FE    //D7   , 40-7E 80-F9    //D8-F7, 40-7E 80-FE    //F8-FE, 40-7E 80-A0  //if (((0x81<=q and q<=0xA0) or (0xB0<=q and q<=0xD6) or (0xD8<=q and q<=0xF7)) and ((0x40<=w and w<=0x7E) or (0x80<=w and w<=0xFE)))  //or (((0xAA<=q and q<=0xAF) or (0xF8<=q and q<=0xFE))                          and ((0x40<=w and w<=0x7E) or (0x80<=w and w<=0xA0)))  //or (              q==0xD7                                                     and ((0x40<=w and w<=0x7E) or (0x80<=w and w<=0xF9))) //  if (q>0x80 and w>=0x40) //      i=i+2 //  else //      i=i+1 //  endif end 如何判断第一个字节和第二个字节的？老师。

user: user-6
content: 参考维基百科GBK条目

user: user-6
content: 没看懂，你写程序的目的是什么

user: user-7
content: 应该用IsDBCSLeadByte

user: user-1
content: 仅供参考：integer proc HZwtail(integer p)     integer s,i,c      if p<1         return(0)     endif     s=0     for i=1 to p         c=CurrChar(i)         case s         when 0             if c>0x80                 s=1             else                 s=0             endif         when 1             if c>=0x40                 s=2             else                 s=0             endif         when 2             if c>0x80                 s=1             else                 s=0             endif         endcase     endfor     return(s)    //GBK汉字内码范围    //81-A0, 40-7E 80-FE    //AA-AF, 40-7E 80-A0    //B0-D6, 40-7E 80-FE    //D7   , 40-7E 80-F9    //D8-F7, 40-7E 80-FE    //F8-FE, 40-7E 80-A0  //if (((0x81<=q and q<=0xA0) or (0xB0<=q and q<=0xD6) or (0xD8<=q and q<=0xF7)) and ((0x40<=w and w<=0x7E) or (0x80<=w and w<=0xFE)))  //or (((0xAA<=q and q<=0xAF) or (0xF8<=q and q<=0xFE))                          and ((0x40<=w and w<=0x7E) or (0x80<=w and w<=0xA0)))  //or (              q==0xD7                                                     and ((0x40<=w and w<=0x7E) or (0x80<=w and w<=0xF9))) //  if (q>0x80 and w>=0x40) //      i=i+2 //  else //      i=i+1 //  endif end