emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  171 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks
本来以为isLowerCase只有对"a"-"z"才为true,isUpperCase只有对 "A"-"Z" 才为true,其它情况下都应该是false,谁知道jdk让我大跌了一回眼镜:

public class E {
public static void main(String[] args) {
  
forchar c = 170; c<65371;c++)
    
if(c==8522
      c
=64255;
    
else if(Character.isLowerCase(c)||Character.isUpperCase(c))
      System.out.println(c
+"("+(c-0)+"):"+Character.isLowerCase(c)+" - "+Character.isUpperCase(c));
 }
}


看了一下,isLowerCase()和isUpperCase()是跟着 getType()的返回走的,jdk认为,getType的返回等于 UPPERCASE_LETTER 的就是大写字母,等于 LOWERCASE_LETTER 的就是小写字母。这本来也没有错。但是 UPPERCASE_LETTER  和 LOWERCASE_LETTER 是两个整型常量,他们的定义见:

http://java.sun.com/j2se/1.4.2/docs/api/constant-values.html

java.lang.Character
...
 public static final byte DIRECTIONALITY_RIGHT_TO_LEFT 1
 public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC 2
...
 public static final byte LOWERCASE_LETTER 2
...
 public static final int MIN_RADIX 2
...
 public static final byte UPPERCASE_LETTER 1


Character的常量撞车撞的这么厉害,不知道设计jdk的人是怎么想的。这样我们getType的时候获得了1,是没有办法知道这个字符是 DIRECTIONALITY_RIGHT_TO_LEFT 的还是 UPPERCASE_LETTER 的,获得2也没有办法知道是 DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC 、MIN_RADIX 还是 LOWERCASE_LETTER 的 ,因此 isLowerCase()和isUpperCase() 通过getType()来判断是否大小写字母当然要犯错误了。

要我说,isLowerCase()和isUpperCase()全部用最简单的写法来实现,也不需要一个getType()的函数调用过程了,直接:

function isLowerCase(ch){
    
return (ch>='a' && ch<='z');
}
function isUpperCase(ch){
    
return (ch>='A' && ch<='Z');
}


不是挺好吗?

常量撞车始终是不对的,JDK为什么要这么干呢?大概是想用二进制位来组合各种type,可是又受限于常量类型被定义为byte型。可是现在的结果是,不但类型常量撞车,各种type还是不能正确的组合。

posted on 2006-03-23 12:59 emu 阅读(1897) 评论(4)  编辑  收藏

评论

# re: JDK的bug? 2006-03-23 14:24 非鱼
要考虑I18N啊,你ch>='a' && ch<="z"才是BUG呢。  回复  更多评论
  

# re: JDK的bug? 2006-03-24 09:25 emu
我不这么认为。isLowerCase什么时候需要关心非英语字母的大小写了?不管如何I18N(),ch>='a' && ch<='z'都应该是isLowerCase的正确定义啊  回复  更多评论
  

# re: JDK的bug? 2006-03-24 11:07 charon@xxx
当然要关心了,希腊字母也有大小写来着
  回复  更多评论
  

# re: JDK的bug? 2006-03-25 10:39 emu
是的,再看了一下JDK文档:

The following are examples of uppercase characters:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
'\u00C0' '\u00C1' '\u00C2' '\u00C3' '\u00C4' '\u00C5' '\u00C6' '\u00C7'
'\u00C8' '\u00C9' '\u00CA' '\u00CB' '\u00CC' '\u00CD' '\u00CE' '\u00CF'
'\u00D0' '\u00D1' '\u00D2' '\u00D3' '\u00D4' '\u00D5' '\u00D6' '\u00D8'
'\u00D9' '\u00DA' '\u00DB' '\u00DC' '\u00DD' '\u00DE'

Many other Unicode characters are uppercase too.

上面两位说的有理。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: