用Java實現按字節長度截取字符串的方法

Web應用程序在瀏覽器中顯示字符串時,因爲顯示長度的限制,經常須要將字符串截取後再進行顯示。但目前不少流行的語言,如C#、Java內部採用的都是 Unicode 16(UCS2)編碼,在這種編碼中全部的字符都是兩個字符,所以,若是要截取的字符串是中、英文、數字混合的,就會產生問題,以下面的字符串:

String s  =   " a加b等於c,若是a等一、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 ++ )
        {
            
//  奇數位置,如三、五、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等一、b等於2,那麼c等3 " ;
System.out.println(bSubstring(s,
6 ));

    上面的代碼截取的字符串是 "a加b等 "
相關文章
相關標籤/搜索