最近做了一个项目有一个判断的问题 小弟在此让高手们帮忙看下 小弟挥泪谢谢大家了! if (!chkNull(strInput)) {
    return false;
}
         byte[] bytes = strInput.getBytes("MS932");
if (bytes.length % 2 != 0) {
return false;
}
         for (int i = 0; i < bytes.length; i++) {
              bytes[i] = (byte) (bytes[i] >= 0 ? bytes[i] : bytes[i] + 256);
     bytes[i + 1] = (byte) (bytes[i + 1] >= 0 ? bytes[i + 1] : bytes[i + 1] + 256);
   if ( !(((bytes[i]>=0x81 && bytes[i]<=0x84)&&(bytes[i + 1]>=0x40 && bytes[i + 1]<=0x7E)) ||
          ((bytes[i]>=0x81 && bytes[i]<=0x84)&&(bytes[i + 1]>=0x80 && bytes[i + 1]<=0xFC)) ||
          ((bytes[i]>=0x89 && bytes[i]<=0x9F)&&(bytes[i + 1]>=0x40 && bytes[i + 1]<=0x7E)) ||
          ((bytes[i]>=0x88 && bytes[i]<=0x9F)&&(bytes[i + 1]>=0x80 && bytes[i + 1]<=0xFC)) ||
          ((bytes[i]>=0xE0 && bytes[i]<=0xEA)&&(bytes[i + 1]>=0x40 && bytes[i + 1]<=0x7E)) ||
          ((bytes[i]>=0xE0 && bytes[i]<=0xEA)&&(bytes[i + 1]>=0x80 && bytes[i + 1]<=0xFC)))) {
      return true;
   }
         }
现在的问题是无论我输入的是半角还是全角if语句的表达式都会判断成true,顺便说一下 我实在是看不懂if表达式的内容这个项目是个日文的项目MS932是日文编码格式问:为什么无论输入什么if都会给它判断成true。小弟雪天跪求高手解答~~~~小弟实在是分不多但是这个问题确实是在工作中遇到的,而且判断的方法必须是这样写。。

解决方案 »

  1.   

    与其这样麻烦的判断,你还不如直接做一个全角到半角的转换。
    日文里的汉字都是全角,只有音图里的那些有半角和全角之分。
    我以前的公司有个包可以搞定这些。但我也看不见源码。
    另外,我记得strut1的验证框架里也有这样的代码的。你可下载个源码看看怎么写的。
      

  2.   

    不行啊,式样书是那么写的所以必须写成我的问题那种形式
    !(((bytes[i]>=0x81 && bytes[i] <=0x84)&&(bytes[i + 1]>=0x40 && bytes[i + 1] <=0x7E)) || 
              ((bytes[i]>=0x81 && bytes[i] <=0x84)&&(bytes[i + 1]>=0x80 && bytes[i + 1] <=0xFC)) || 
              ((bytes[i]>=0x89 && bytes[i] <=0x9F)&&(bytes[i + 1]>=0x40 && bytes[i + 1] <=0x7E)) || 
              ((bytes[i]>=0x88 && bytes[i] <=0x9F)&&(bytes[i + 1]>=0x80 && bytes[i + 1] <=0xFC)) || 
              ((bytes[i]>=0xE0 && bytes[i] <=0xEA)&&(bytes[i + 1]>=0x40 && bytes[i + 1] <=0x7E)) || 
              ((bytes[i]>=0xE0 && bytes[i] <=0xEA)&&(bytes[i + 1]>=0x80 && bytes[i + 1] <=0xFC)))问题是为什么这个判断无论输什么都判断成true
      

  3.   

    这个问题很好解决,你搞复杂了,一个简单方式可以判断
    String data=".....";
    //全角占为为2位以上
    return data.length()==data.getBytes().length;
      

  4.   

    设计者的意思就是,如果是全角字符,那么它应该有两个字节,且第一第二个字节满足一下任意一个:
    0x81<=首字节<=0x84  且 0x40<=第二字节<=0x7E
    0x81<=首字节<=0x84  且 0x80<=第二字节<=0xFC
    0x89<=首字节<=0x9F  且 0x40<=第二字节<=0x7E
    0x88<=首字节<=0x9F  且 0x80<=第二字节<=0xFC
    0xE0<=首字节<=0xEA  且 0x40<=第二字节<=0x7E
    0xE0<=首字节<=0xEA  且 0x80<=第二字节<=0xFC
    这样的设计者一定对该字符集有很深刻得了解。但是实现这个算法的人有两处失误:
    1.
    for (int i = 0; i < bytes.length; i++) {
        bytes[i] = 无符号的第一字节;
        bytes[i + 1] = 无符号的下一个字节;
        if (不是日文全角) {
          return true;
        }
    }
    这里的i++用错。在i++情况下,不是一次检查一个字符,而是一次检查一个字节,每个全角字符会产生错位,而是应该i+=2,检查完后向后挪2个字节。2.
    ((bytes[i]>=0x81 && bytes[i] <=0x84)&&(bytes[i + 1]>=0x40 && bytes[i + 1] <=0x7E)) ||
    ((bytes[i]>=0x81 && bytes[i] <=0x84)&&(bytes[i + 1]>=0x80 && bytes[i + 1] <=0xFC)) ||
    ((bytes[i]>=0x89 && bytes[i] <=0x9F)&&(bytes[i + 1]>=0x40 && bytes[i + 1] <=0x7E)) ||
    ((bytes[i]>=0x88 && bytes[i] <=0x9F)&&(bytes[i + 1]>=0x80 && bytes[i + 1] <=0xFC)) ||
    ((bytes[i]>=0xE0 && bytes[i] <=0xEA)&&(bytes[i + 1]>=0x40 && bytes[i + 1] <=0x7E)) ||
    ((bytes[i]>=0xE0 && bytes[i] <=0xEA)&&(bytes[i + 1]>=0x80 && bytes[i + 1] <=0xFC))
    随便抽一个诸如bytes[i]>=0x81来看,左边是byte,右边是int,比较起来会把两边都变成int,这个应该是常识。那么拿“ス”进去套一下,第一个字节是0x83,第二字解释0x58。(int)0x83=0xffffff83>0xFF,所以所有的bytes[i]<=都不成立,也就判断失败。正确的应该改成:for (int i = 0; i < bytes.length; i += 2) {
    bytes[i] = (byte) (bytes[i] >= 0 ? bytes[i] : bytes[i] + 256);
    bytes[i + 1] = (byte) (bytes[i + 1] >= 0 ? bytes[i + 1] : bytes[i + 1] + 256);
    if (!(((bytes[i] >= (byte) 0x81 && bytes[i] <= (byte) 0x84) && (bytes[i + 1] >= (byte) 0x40 && bytes[i + 1] <= (byte) 0x7E))
    || ((bytes[i] >= (byte) 0x81 && bytes[i] <= (byte) 0x84) && (bytes[i + 1] >= (byte) 0x80 && bytes[i + 1] <= (byte) 0xFC))
    || ((bytes[i] >= (byte) 0x89 && bytes[i] <= (byte) 0x9F) && (bytes[i + 1] >= (byte) 0x40 && bytes[i + 1] <= (byte) 0x7E))
    || ((bytes[i] >= (byte) 0x88 && bytes[i] <= (byte) 0x9F) && (bytes[i + 1] >= (byte) 0x80 && bytes[i + 1] <= (byte) 0xFC))
    || ((bytes[i] >= (byte) 0xE0 && bytes[i] <= (byte) 0xEA) && (bytes[i + 1] >= (byte) 0x40 && bytes[i + 1] <= (byte) 0x7E))
    || ((bytes[i] >= (byte) 0xE0 && bytes[i] <= (byte) 0xEA) && (bytes[i + 1] >= (byte) 0x80 && bytes[i + 1] <= (byte) 0xFC)))) {
    return true;
    }
    }