飛翔的起點

          從這里出發

          導航

          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          統計

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          怎么得到ucs2字符串中制定位數

           Web應用程序在瀏覽器中顯示字符串時,由于顯示長度的限制,常常需要將字符串截取后再進行顯示。但目前很多流行的語言,如C#Java內部采用的都是 Unicode 16(UCS2)編碼,在這種編碼中所有的字符都是兩個字符,因此,如果要截取的字符串是中、英文、數字混合的,就會產生問題,如下面的字符串:

          String s = "a加b等于c,如果a等1、b等于2,那么c等3";

              上面的字符串既有漢字,又有英文字符和數字。如果要截取前6個字節的字符,應該是”a加b等",但如果用substring方法截取前6個字符就成了"a 加b等于c"。產生這個問題的原因是將substring方法將雙字節的漢字當成一個字節的字符(UCS2字符)處理了。要解決這個問題的方法是首先得到該字符串的UCS2編碼的字節數組,如下面的代碼如下:

          byte[] bytes = s.getBytes("Unicode");

              由于上面生成的字節數組中前兩個字節是標志位,bytes[0] = -2,bytes[1] = -1,因此,要從第三個字節開始掃描,對于一個英文或數字字符,UCS2編碼的第二個字節是相應的ASCII,第一個字節是0,如a的UCS2編碼是0  97,而漢字兩個字節都不為0,因此,可以利于UCS2編碼的這個規則來計算實際的字節數,該方法的實現代碼如下:

              public static String bSubstring(String s, int length) throws Exception
              {

                  
          byte[] bytes = s.getBytes("Unicode");
                  
          int n = 0// 表示當前的字節數
                  int i = 2// 要截取的字節數,從第3個字節開始
                  for (; i < bytes.length && n < length; i++)
                  {
                      
          // 奇數位置,如3、5、7等,為UCS2編碼中兩個字節的第二個字節
                      if (i % 2 == 1)
                      {
                          n
          ++// 在UCS2第二個字節時n加1
                      }
                      
          else
                      {
                          
          // 當UCS2編碼的第一個字節不等于0時,該UCS2字符為漢字,一個漢字算兩個字節
                          if (bytes[i] != 0)
                          {
                              n
          ++;
                          }
                      }
                  }
                  
          // 如果i為奇數時,處理成偶數
                  if (i % 2 == 1)

                  {
                      
          // 該UCS2字符是漢字時,去掉這個截一半的漢字
                      if (bytes[i - 1] != 0)
                          i 
          = i - 1;
                      
          // 該UCS2字符是字母或數字,則保留該字符
                      else
                          i 
          = i + 1;
                  }

                  
          return new String(bytes, 0, i, "Unicode");
              }

              下面代碼使用了bSubstring方法:

          String s = "a加b等于c,如果a等1、b等于2,那么c等3";
          System.out.println(bSubstring(s,
          6));

              上面的代碼截取的字符串是"a加b等"

          posted on 2008-09-08 23:02 forgood 閱讀(329) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 民权县| 宁津县| 视频| 杭锦后旗| 会昌县| 深水埗区| 达日县| 临朐县| 农安县| 贵阳市| 翼城县| 静乐县| 宣化县| 星子县| 灵宝市| 偃师市| 那曲县| 陇西县| 荆州市| 海林市| 特克斯县| 枣强县| 子长县| 六枝特区| 岱山县| 穆棱市| 鲁甸县| 望都县| 安徽省| 阿克陶县| 耒阳市| 定结县| 虹口区| 德州市| 温泉县| 滦南县| 襄城县| 平顶山市| 沈丘县| 鄄城县| 泰兴市|