java多字節(jié)字符串按字節(jié)截取

算法思路

1.先按照實(shí)際要截取的字節(jié)長(zhǎng)度,復(fù)制一份字節(jié)數(shù)組

2.轉(zhuǎn)換回字符串,計(jì)算字符長(zhǎng)度resLen,并按這個(gè)長(zhǎng)度截取原字符串

3.計(jì)算截取的字符串的字節(jié)數(shù)是否等于需求長(zhǎng)度len,相等則直接返回,不相等,則在resLen的基礎(chǔ)上減1再截取,則為需要的結(jié)果

此算法截取的結(jié)果為向前截取,即保證最終截取的字節(jié)長(zhǎng)度不能超過需求長(zhǎng)度len,比如gbk字符集,"一二三四五",截取3字節(jié),結(jié)果應(yīng)為"一",實(shí)際長(zhǎng)度為2字節(jié),第3個(gè)字節(jié)為半個(gè)中文,屬于無效字符,需要去掉。

在轉(zhuǎn)換字節(jié)數(shù)組時(shí),需要指定字符集,在不同的字符集下,轉(zhuǎn)換出來的字節(jié)數(shù)組長(zhǎng)度是不一樣的。

經(jīng)測(cè)試,效率要高于按循環(huán)的算法,尤其在截取長(zhǎng)度較大時(shí),性能較優(yōu)

代碼

public static String substr(String str, int len, 

                                String cs) throws UnsupportedEncodingException {

        byte[] br = new byte[len];

        byte[] bt = str.getBytes(cs);

        System.arraycopy(bt, 0, br, 0, len);

        String res = new String(br, cs);

        int resLen = res.length();

        if (str.substring(0, resLen).getBytes(cs).length > len) {

            res = str.substring(0, resLen - 1);

        }

        return res;

    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,740評(píng)論 18 399
  • 一、字符串操作 strcpy(p, p1) 復(fù)制字符串 strncpy(p, p1, n) 復(fù)制指定長(zhǎng)度字符串 s...
    JaiUnChat閱讀 1,752評(píng)論 0 7
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,683評(píng)論 0 4
  • 元宵佳節(jié),本是冷門的廣場(chǎng)因?yàn)闊魰?huì)的到來,立刻變得熱鬧非凡起來,五彩繽紛的燈在廣場(chǎng)中央,引游人駐目。
    起始之點(diǎn)閱讀 268評(píng)論 0 0
  • 今天,王寶強(qiáng)離婚的事,成了熱點(diǎn)。我們看到了許許多多關(guān)于這個(gè)事件的看法。 首先,一個(gè)演員的離婚事件,居然再一次掀起了...
    岑岑言閱讀 409評(píng)論 0 1

友情鏈接更多精彩內(nèi)容