ms932判断全角

来源:互联网 发布:淘宝上有卖岛国片店 编辑:程序博客网 时间:2024/05/02 01:53

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

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 (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; }}
原创粉丝点击