<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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型。可是現在的結果是,不但類型常量撞車,各種type還是不能正確的組合。

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

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


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


    網站導航:
     
    主站蜘蛛池模板: 又黄又爽的视频免费看| 在人线av无码免费高潮喷水| 亚洲AV无码一区二区三区牛牛| 亚洲国产成人久久精品大牛影视| a级毛片免费高清视频| 无码乱肉视频免费大全合集| 久久精品国产亚洲AV电影| 99ee6热久久免费精品6| 亚洲白嫩在线观看| 91在线品视觉盛宴免费| 久久久久亚洲国产| 国产无遮挡吃胸膜奶免费看| 猫咪免费观看人成网站在线| av在线亚洲欧洲日产一区二区| 亚洲美国产亚洲AV| 一区二区免费视频| 中文字幕亚洲无线码| 亚洲精品美女久久7777777| 免费无码又爽又刺激高潮| 亚洲成人高清在线观看| 麻豆精品不卡国产免费看| 久久丫精品国产亚洲av不卡| 欧洲乱码伦视频免费| 亚洲欧美在线x视频| 国产亚洲精品成人a v小说| 最新亚洲人成网站在线观看| 亚洲视频在线精品| 久久综合国产乱子伦精品免费| 亚洲国产成人久久精品app| 久久成人免费电影| 亚洲精品国产美女久久久| 一级毛片免费一级直接观看| 五月婷婷亚洲综合| 国内精品一级毛片免费看| 亚洲另类小说图片| 亚洲国产精品一区二区第一页免| 精品在线免费视频| 亚洲国产成人片在线观看| 欧美最猛性xxxxx免费| 久久久久免费视频| 亚洲字幕AV一区二区三区四区|