(GBK 编码) 一个字节数组 ,结尾是完整的,但是开头有可能出现半个字符,就是乱码,怎样判断字符数组的开头是否是个不完整的字符,

解决方案 »

  1.   

    GBK 是由一个字节或者两个字节组成的一个字节的格式为:0x00~0x7F两个字节的格式为:
    第一个字节:0x81~0xFE
    第二个字节:0x40~0xFE(不含 0x7F)---------------------------------
    但是开头有可能出现半个字符是不是可以理解为,最坏的情况就是开头的第一个字符坏掉,之后的字符都是好的。最好的情况就是都是好的,一个都没坏。因为字符编码是从左往右匹配字节的,如果第一个 GBK 汉字掉了一个字节,那这个汉字的后半个字节如果能跟后面一个字符的前一个字节也会拼成一个合法字符的。
      

  2.   


    ---------------------------------------------------------------由于第一个字节有可能是半个字符,也就说可能是一个gbk字符的低位或高位字节(第一个或第二个字节)问题是很多时候 第一个字节 的范围 很可能也在第二个字节的范围内,反之也是所以没办法通过高、低位字节范围来判断第一个字符是否为半个-----------------------------------------------------------------我们知道英文字符以GBK编码时只占一个字节或二字节(编码大于128小于256的英文字符,估计是全角的吧),编码小于等于128的 
    字符GBK字符与Unicode编码兼容,中文字符以GBK编码时,占两个字节也就说不管当汉字或全角英文的时候是双字节表示,普通英文是单字节-------------------------------------------------------------------那么假设楼主只有第一个字符可能出现缺一个字节的情况:这样我们就有了个最简单的思路:遍历这个字节数组,在遍历过程中判断字节范围是否是0-127 如果不是就累加1 直到遇到 值为0-127就break掉;这时候判断累加的值 如果是偶数,那说明前面的字符串都是完整的双字节的,那就没有半个字符串的情况存在如果是奇数,那就有可能有半个字符串的情况存在了

      

  3.   

    这种算法好像不行有漏洞啊,因为双字节字符中的第二位也有可能在80–FE之间,这样的话,如果一个排列是 0x60|0x85 0x86|0x90 0x45  如果是这样到排列,你这种算偶数的做法就不行  这种排列奇数也有可能是完整到字符
      

  4.   


    已经在你重复提交的同一个帖子里提到了gbk第二个字节 范围是 40-fe 和 80-fe 也就说第二个字节可能和正常的ASCII重叠所以 也无法判断暂时 想不到办法了等高手吧~~~
      

  5.   

    无法判断。
    GBK的第二字节的编码范围包含全部ASCII码。
    也就是说GBK编码的双字节字符去掉第一字节后仍然可能是合法的ASCII字符。
      

  6.   

    utf-8编码容易判断 ,问题是GBK怎么判断,或者让它判断的错误率最小也行,一般常用字不出错就行,有这样的办法吗?