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

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

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

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數據加載中……

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

    本文為原創,如需轉載,請注明作者和出處,謝謝!

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




    Android開發完全講義(第2版)(本書版權已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-09-07 09:46 銀河使者 閱讀(11584) 評論(11)  編輯  收藏 所屬分類: javaweb 原創

    評論

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    String s = "a加b等于c,如果a等1、b等于2,那么c等3";
    System.out.println(bSubstring(s, 5));
    這個返回什么?
    2008-09-07 15:58 | Lau Jeffrey

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    to Lau Jeffrey

    由于前5個字節,第5個字節將漢字截取一半,所以把這個漢字去了,返回“a加b"

    如果想將截一半的漢字要保留,可以將
    if (i % 2 == 1)

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

    改成
    if (i % 2 == 1)
    {
    i = i + 1;
    }
    2008-09-08 08:51 | 銀河使者

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    路過,呵呵
    2008-09-08 11:56 | Fingki.li

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    非常不錯。頂一下
    2008-09-09 17:51 |

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    你好,認識一下,我是stevenjk,在csai的同城拜師看到你的信息,我也在遼寧沈陽。
    http://www.educity.cn/56bs/teacherlist.asp?province=%C1%C9%C4%FE
    2008-09-26 14:21 | stevenjk

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    你好,很高興認識你。如果你有聯系方式,可以在我的blog里私人留言。 I'm glad to see you.
    2008-09-26 14:48 | 銀河使者

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    你好,你寫的文章都很精辟,通俗易懂,我學到了很多。針對這個方法我進行調試發現和你說的有一點不相符的地方,就是bytes[0] = -1,bytes[1] = -2,不知道是怎么回事,是否和系統編碼有關系呢,希望能夠給以解答,在這里先謝謝了
    2009-04-01 16:53 | xiasheng

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    寫的很詳細 ,學習了
    2010-12-13 16:15 | aw

    # re: 用Java實現按字節長度截取字符串的方法  回復  更多評論   

    呵呵,學習ing。對于這個真不了解。
    2012-06-15 20:19 | 紅淚

    # re: 用Java實現按字節長度截取字符串的方法[未登錄]  回復  更多評論   

    GBK編碼java代碼,感覺總是少兩個字符
    String s = "abc中文123";
    System.out.println(bSubstring(s, 3));

    我的環境打印出來是:a,而不是想象的abc,很怪異,麻煩老師看下,謝謝
    2013-05-20 16:46 | bruce

    # re: 用Java實現按字節長度截取字符串的方法[未登錄]  回復  更多評論   

    int i=6;//想截取的位數
    while(name.getBytes().length>6) {
    name = name.substring(0, i--);
    }
    直接也好用了
    2014-01-03 11:40 | 小菜鳥
    主站蜘蛛池模板: 亚洲中文字幕无码久久精品1| 亚洲精品国产专区91在线| 免费无码黄网站在线看| 亚洲黄色免费观看| 国产大片免费观看中文字幕| 国产午夜精品免费一区二区三区 | 91亚洲性爱在线视频| 国产精品色午夜视频免费看| 成在线人视频免费视频| 国产成人精品日本亚洲网址| 久久久久亚洲精品男人的天堂| 久久w5ww成w人免费| 污视频网站免费在线观看| 亚洲精品第五页中文字幕| 亚洲A∨精品一区二区三区| 131美女爱做免费毛片| 日日狠狠久久偷偷色综合免费| 亚洲国产综合精品中文第一区| 免费在线观看黄网| 思思re热免费精品视频66| 国产精品一区二区三区免费| 国产亚洲精品成人AA片| 亚洲国产精品lv| 亚洲午夜爱爱香蕉片| 老司机永久免费网站在线观看| 午夜免费福利小电影| 日日狠狠久久偷偷色综合免费| 99久久国产亚洲综合精品| 内射干少妇亚洲69XXX| 国产成人A亚洲精V品无码| 日韩免费视频一区| 91网站免费观看| 日韩免费无码视频一区二区三区| 国产午夜亚洲精品不卡电影| 亚洲国产亚洲片在线观看播放| 亚洲高清国产AV拍精品青青草原| 亚洲国产精品综合久久一线| 好爽又高潮了毛片免费下载| 国产精品久久永久免费| 免费一级不卡毛片| 成人免费无码H在线观看不卡|