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

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

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

    隨筆-208  評(píng)論-469  文章-30  trackbacks-0

    通常在網(wǎng)頁(yè)里都有一種這樣的需求,為了界面整潔,在顯示標(biāo)題時(shí)需要把長(zhǎng)標(biāo)題以部分加省略號(hào)連綴顯示,就比如中國(guó)博客網(wǎng)顯示日志標(biāo)題--下面那樣

    ·在VC6中使用正則表達(dá)式解析...(2007-06-24)?
    ·VC中使用CInternet...(2007-06-23)?
    ·開源嵌入式數(shù)據(jù)庫(kù) SQLit...(2007-06-23)?

    問題一是前面那部分字符串怎么來(lái)確定,上面很明顯示的看得出來(lái),因?yàn)闃?biāo)題中混雜著中英文,仍然沒有達(dá)到初衷。

    大部分的實(shí)現(xiàn)方式是原字符串超過(guò)一定的長(zhǎng)度一切取前面指定個(gè)數(shù)的字符然后加上省略號(hào),顯示中文和英文是不能同等對(duì)待,10個(gè)漢字的寬度一般來(lái)說(shuō)要大于10字母的寬度,再聰明一點(diǎn)就是近似把一個(gè)漢字折算成兩個(gè)字母寬度來(lái)估算,可是還要注意一點(diǎn)即使全是英文,10個(gè)W也要比10i寬得多,還是未能得嘗所愿。

    對(duì)于單純的切取前面若干字符的支持有一些現(xiàn)成的東西:
    1. Jakarta Commons Lang 中的 StringUrl.abbreviate() 工具方法
    2. prototype.js 中的 truncate 函數(shù)
    3. CSS 樣式表 text-overflow:ellipsis 或 -o-text-overflow:ellipsis (opera中)
    可是第三種方法又有點(diǎn)傻,會(huì)根據(jù)你所設(shè)字符集可能從半個(gè)字符中斷開,產(chǎn)生亂碼,前面兩種方法以雙字節(jié)字符來(lái)處理,沒這個(gè)問題。你可把第二個(gè)<div>拷貝出來(lái),文件存成UTF-8 或別的字符集文件來(lái)試試。

    < div? style ="border:1px?solid?red;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap;width=60" > I?am?Unmi </ div >

    效果如右所示:
    I am Unmi

    <div?style="border:1px?solid?red;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap;width=60">我在哪里</div>

    效果如右所示:
    我在哪里

    費(fèi)了這么多像素,這才真正切入正題,字符串真正寬度總是跟選用的字體名、字型、大小有關(guān),下面要介紹的方法就是依據(jù)顯示所用的字體、字形、大小可算出每一個(gè)字符在屏幕上的真正顯示寬度單位,不管是中文還是英文、是W還是i都可以在正確的位置切下去。

    如假設(shè)一個(gè)中文字是12個(gè)單位寬度,那么W是12個(gè)單位寬度,i是2個(gè)單位寬度。

    實(shí)現(xiàn)代碼如下:getFitWidthString 傳入一個(gè)字符串及預(yù)設(shè)顯示寬度單位,可能不是真正的像素。

    public?static?String?getFitWidthString(?Object?object,?int?point?){
    ????String?str?
    =?(?null?==?object?)???""?:?object.toString();
    ????
    //假定網(wǎng)頁(yè)顯示字符用的是?11pt?的?宋體?普通字體
    ????FontMetrics?fm?=?Toolkit.getDefaultToolkit().getFontMetrics(new?Font("宋體",?Font.PLAIN,?11));
    ????
    int?length?=?0;
    ????
    int?pos?=?0;
    ????
    for(?int?i?=?0;?i?<?str.length();?i++){
    ????????
    int?currlen?=?fm.charWidth(?str.charAt(?i?)?);
    ????????length?
    +=?currlen;
    ????????
    if(?length?>?point?){
    ????????????
    continue;
    ????????}

    ????????pos?
    =?i-1;
    ????}

    ????pos
    =pos<0???0?:?pos;
    ????
    if(?point?<?length?){
    ????????
    return?str.substring(?0,?pos?)?+?"";
    ????}

    ????
    else{
    ????????
    return?str;
    ????}

    }

    回到最早的那個(gè)例子,如果用getFitWidthString來(lái)截取字符串執(zhí)行如下碼,我們可以看看輸出效果

    System.out.println(getFitWidthString("在VC6中使用正則表達(dá)式解析字符串",?160));
    System.out.println(getFitWidthString(
    "VC中使用CInternetSession抓取網(wǎng)頁(yè)內(nèi)容",?160));
    System.out.println(getFitWidthString(
    "開源嵌入式數(shù)據(jù)庫(kù)?SQLite?簡(jiǎn)介",?160));

    取了160個(gè)輸出單位寬度,輸出

    在VC6中使用正則表達(dá)式解...
    VC中使用CInternetSessio...
    開源嵌入式數(shù)據(jù)庫(kù) SQLite 簡(jiǎn)介

    是不是更準(zhǔn)確了些,當(dāng)然還有些瑕疵,單個(gè)字符占寬度單位多的話誤差也會(huì)大一些,你可以對(duì)上面的程序進(jìn)行修正更滿足您的需求。

    因?yàn)橛玫搅薃WT圖形環(huán)境的東西,所以如果你是在控制臺(tái)下啟動(dòng)的應(yīng)用服務(wù)器就需要作些配置,就像WEB應(yīng)用使用了JFreeChart來(lái)畫圖也是需要為Unix/Linux控制臺(tái)下啟動(dòng)的應(yīng)用服務(wù)器作些配置,Tomcat要在啟動(dòng)腳本中加個(gè)參數(shù),WAS的話要下載一個(gè)插件,Windows下總是在圖形環(huán)境下,無(wú)需作額外設(shè)置。

    posted on 2007-07-05 01:18 EricWong 閱讀(343) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精成人品日日拍夜夜免费| 宅男666在线永久免费观看| 国产电影午夜成年免费视频| 色妞WWW精品免费视频| 亚洲精品国产字幕久久不卡| 亚洲视频在线观看2018| 亚洲中文字幕无码mv| 福利免费在线观看| 成人毛片免费观看视频在线| 亚洲免费观看视频| 美女被爆羞羞网站在免费观看| 日韩精品免费一级视频| 亚洲精品无码永久中文字幕| 久久久久久国产a免费观看不卡| 成人毛片18女人毛片免费视频未| 97久久国产亚洲精品超碰热| 在线播放免费播放av片| 亚洲国产精品张柏芝在线观看| a级毛片在线免费| www国产亚洲精品久久久日本| 亚洲一卡2卡3卡4卡5卡6卡| 热99re久久免费视精品频软件| 中文字幕在线观看亚洲| 免费在线观影网站| 久久久久亚洲精品无码网址| 毛片亚洲AV无码精品国产午夜| 亚洲人成电影网站免费| 亚洲毛片一级带毛片基地| 在线观看免费播放av片| 亚洲乱码一区av春药高潮| 最刺激黄a大片免费网站| 亚洲伊人tv综合网色| 免费精品99久久国产综合精品| 亚洲人成网7777777国产| www.免费在线观看| 春暖花开亚洲性无区一区二区| 国产亚洲精品自在线观看| 免费观看AV片在线播放| 亚洲av一本岛在线播放 | 免费人成网站永久| 日韩一区二区三区免费体验|