隨筆-208  評論-469  文章-30  trackbacks-0

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

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

          問題一是前面那部分字符串怎么來確定,上面很明顯示的看得出來,因為標題中混雜著中英文,仍然沒有達到初衷。

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

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

          < 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>

          效果如右所示:
          我在哪里

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

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

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

          public?static?String?getFitWidthString(?Object?object,?int?point?){
          ????String?str?
          =?(?null?==?object?)???""?:?object.toString();
          ????
          //假定網(wǎng)頁顯示字符用的是?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;
          ????}

          }

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

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

          取了160個輸出單位寬度,輸出

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

          是不是更準確了些,當然還有些瑕疵,單個字符占寬度單位多的話誤差也會大一些,你可以對上面的程序進行修正更滿足您的需求。

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

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

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 安龙县| 阳原县| 京山县| 乐清市| 扎囊县| 会泽县| 亳州市| 遵化市| 龙山县| 福安市| 清镇市| 洛浦县| 常熟市| 兴山县| 宜阳县| 桂平市| 东安县| 偃师市| 扬中市| 黔南| 沐川县| 黄冈市| 三河市| 右玉县| 思南县| 武鸣县| 岱山县| 施秉县| 盖州市| 榕江县| 滦南县| 河南省| 酒泉市| 鹤壁市| 尚义县| 怀来县| 永和县| 诸城市| 尉氏县| 岱山县| 靖安县|