ms932判断全角

最近做了一个项目有一个判断的问题 小弟在此让高手们帮忙看下 小弟挥泪谢谢大家了!

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。。。。。。。小弟雪天跪求高手解答~~~~小弟实在是分不多但是这个问题确实是在工作中遇到的,而且判断的方法必须是这样写。。。。。

 

 

设计者的意思就是,如果是全角字符,那么它应该有两个字节,且第一第二个字节满足一下任意一个:
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]<=都不成立,也就判断失败。

正确的应该改成:
Java code
    
    
    
for
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值