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

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

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

    snowolf

    這樣的一種生活
    posts - 23, comments - 5, trackbacks - 0, articles - 11

    精確截取字符串(轉(zhuǎn)載)

    Posted on 2006-06-13 10:46 snowolf 閱讀(864) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 學(xué)習(xí)
    開(kāi)發(fā)中經(jīng)常遇到,字符串過(guò)長(zhǎng),無(wú)法完全顯示的問(wèn)題

    這時(shí)候就需要截取我們所需要的長(zhǎng)度,后面顯示省略號(hào)或其他字符。

    由于中文字符占兩個(gè)字節(jié),而英文字符占用一個(gè)字節(jié),所以,單純地判斷字符數(shù),效果往往不盡如人意

    下面的方法通過(guò)判斷字符的類(lèi)型來(lái)進(jìn)行截取,效果還算可以:)


    如果大家有其他的解決方法歡迎貼出來(lái),共同學(xué)習(xí):)
    **********************************************************************
    private String str;
    private int counterOfDoubleByte;
    private byte b[];
    /**
    * 設(shè)置需要被限制長(zhǎng)度的字符串
    * @param str 需要被限制長(zhǎng)度的字符串
    */
    public void setLimitLengthString(String str){
    ? this.str = str;
    }
    /**
    * @param len 需要顯示的長(zhǎng)度(<font color="red">注意:長(zhǎng)度是以byte為單位的,一個(gè)漢字是2個(gè)byte</font>)
    * @param symbol 用于表示省略的信息的字符,如“...”,“>>>”等。
    * @return 返回處理后的字符串
    */
    public String getLimitLengthString(int len, String symbol) throws UnsupportedEncodingException {
    ? counterOfDoubleByte = 0;
    ? b = str.getBytes("GBK");
    ? if(b.length <= len)
    ??? return str;
    ? for(int i = 0; i < len; i++){
    ??? if(b[i] < 0)
    ????? counterOfDoubleByte++;
    ? }

    ? if(counterOfDoubleByte % 2 == 0)
    ??? return new String(b, 0, len, "GBK") + symbol;
    ? else
    ??? return new String(b, 0, len - 1, "GBK") + symbol;
    }


    本文轉(zhuǎn)貼自網(wǎng)友:focus2004 的文章

    #?re: 精確截取字符串(轉(zhuǎn)載) 2006-01-28 18:24 tdg
    大作拜讀,有一點(diǎn)愚見(jiàn),特拋磚引玉:
    1。字符串除了可以基于byte[]操作外,還可以基于char[]操作。看老大你的意圖是想截取字符串的前幾個(gè)字符然后加上省略符號(hào)最后輸出而已,完全不必考慮用byte[]數(shù)組操作啊 。而且好像開(kāi)發(fā)中更注重語(yǔ)義上的第幾個(gè)字符而不是你說(shuō)的這種情況哦。
    2。以下是拙作,請(qǐng)斧正:
    /**
    * 字符串截取函數(shù)
    * @param str String 要處理的字符串
    * @param length int 需要顯示的長(zhǎng)度
    * @param symbol String 用于表示省略的信息的字符,如“...”,“>>>”等
    * @return String 返回處理后的字符串
    * @throws UnsupportedEncodingException
    */
    public String getLimitLengthString(String str, int length, String symbol) throws
    UnsupportedEncodingException {
    assert str != null;
    assert length > 0;
    assert symbol != null;
    //如果字符串的位數(shù)小于等于要截取的位數(shù),附加上表示省略的信息的字符串后返回
    if (str.length() <= length) {
    return str + symbol;
    //從零開(kāi)始,截取length個(gè)字符,附加上表示省略的信息的字符串后返回
    } else {
    str = new String(str.getBytes("GBK"));
    char[] charArray = str.toCharArray();
    char[] charArrayDesc = new char[length];
    System.arraycopy(charArray, 0, charArrayDesc, 0, length);
    return new String(charArrayDesc) + symbol;
    }
    }??

    呵呵 tdg 兄很認(rèn)真喔,談不上斧正。主要是這個(gè)問(wèn)題,用 char 處理,如果是字母或者數(shù)字,實(shí)際上截取出來(lái)的會(huì)比漢字少占用一半的空間,所以截取出來(lái)后,還是不能對(duì)齊。而實(shí)際上 char 數(shù)組中,不管是字母、數(shù)字還是漢字,它們都只代表一個(gè)單元。但是 byte 則不同,字母、數(shù)字只占用一個(gè)字節(jié),而漢字占用兩個(gè)字節(jié)(都是GBK編碼)。??

    您好!
    你的文章讓我受益不少,有個(gè)問(wèn)題想向您確認(rèn)一下:
    在代碼中
    b = str.getBytes("GBK");
    if(b.length <= len)
    return str;
    for(int i = 0; i < len; i++){
    if(b[i] < 0)
    counterOfDoubleByte++;
    }
    是不是如果只要是中文漢字,在b[i]對(duì)應(yīng)的值都是小于0的,
    也就是說(shuō),在漢字代表的兩個(gè)字節(jié)中,這兩個(gè)漢字分別轉(zhuǎn)化為整數(shù)值時(shí),是不是一定小于0,但值范圍不能小于-127的。做過(guò)測(cè)試,不能肯定。:)

    istarliu,這里要強(qiáng)調(diào)一下,GBK、GB2312 雙字節(jié)編碼字節(jié)才是負(fù)的。UTF-8 三字節(jié)編碼未去核實(shí)。

    來(lái)源
    主站蜘蛛池模板: 1024免费福利永久观看网站| 亚洲色偷偷偷网站色偷一区| 无码日韩人妻av一区免费| 成在线人免费无码高潮喷水| 亚洲国产精品无码久久| 亚洲成a人片在线观看播放| 美腿丝袜亚洲综合| 看全色黄大色大片免费久久 | 日日操夜夜操免费视频| 免费视频爱爱太爽了| 久久国产乱子伦精品免费不卡| 成年大片免费高清在线看黄| 亚洲精品天堂在线观看| 亚洲女人初试黑人巨高清| 亚洲2022国产成人精品无码区| 2048亚洲精品国产| 亚洲国产人成精品| 免费看国产一级片| 国产精品四虎在线观看免费| 一本无码人妻在中文字幕免费| 99久久综合精品免费| 免费人成黄页在线观看日本| 中文日本免费高清| 中文字幕在线免费看| 久久av免费天堂小草播放| 一级**爱片免费视频| 日本一区二区在线免费观看 | 免费91最新地址永久入口| 成人毛片100免费观看| 老司机午夜免费视频| 美女无遮挡免费视频网站| 美女视频黄a视频全免费网站色 | 午夜免费福利小电影| 国产精品免费无遮挡无码永久视频| 国产一二三四区乱码免费| 在线观看肉片AV网站免费 | 色播亚洲视频在线观看| 亚洲午夜精品一区二区| 亚洲美女在线观看播放| 亚洲成人在线免费观看| 亚洲色大成网站www永久男同|