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)?{
          ??
          for(?char?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型??墒乾F在的結果是,不但類型常量撞車,各種type還是不能正確的組合。

          posted on 2006-03-23 12:59 emu 閱讀(1910) 評論(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.

          上面兩位說的有理。  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 正安县| 神木县| 长武县| 新昌县| 文山县| 丹江口市| 安吉县| 张掖市| 阳谷县| 乐亭县| 丰都县| 柯坪县| 盈江县| 大足县| 壶关县| 鄂托克前旗| 乌拉特前旗| 会东县| 罗山县| 清苑县| 眉山市| 贵德县| 漠河县| 合山市| 酒泉市| 星子县| 甘洛县| 屯留县| 容城县| 沙河市| 辽阳市| 依兰县| 五莲县| 灵山县| 武山县| 汶川县| 许昌县| 南安市| 鸡西市| 延川县| 老河口市|