用C#截取指定長度的中英文混合字串的最終演算法

來源:互聯網
上載者:User
去年的時候由於工作需要,寫了個用C#截取指定長度的方法,當時頗費了一番周折,因為想錯了方向。
例如要截取字串"我是1個中國人",取3位長度,那得到的結果是"我",如果取6位長度,得到的結果是"我是1",因為漢字是兩個位元組。
當時的思路主要是考慮最後一位是單位元組還是雙位元組,不過最終得出了比較不錯的方法,只是這方法後來卻找不到了,重新寫一個又太懶,想或許到Google上能搜尋到,但是可惜的是,搜尋到的方法幾乎都有問題,不單是效率,還有結果都不能正常顯示,有的文章甚至被不少大網站互相轉來轉去,呀,沒有人調試過嗎?

拿出時間來自己寫一個,大家看代碼:
 

public static string GetSubString(string str, int length)
    {
        string temp = str;
        int j = 0;
        int k = 0;
        for (int i = 0; i < temp.Length; i++)
        {
            if (Regex.IsMatch(temp.Substring(i, 1), @"[\u4e00-\u9fa5]+"))
           {
                j += 2;
            }
            else
            {
                j += 1;
            }
            if (j <= length)
            {
                k += 1;
            }
            if (j >= length)
            {
                return temp.Substring(0, k);
            }
        }
        return temp;
    }

具體思路是,定義兩個變數:j 與K,例如要截取字串"我是1個中國人",取3位長度,從第一個字元開始判斷——temp.Substring(i, 1),如果是雙位元組j+2,否則加1,而變數K則每次迴圈加1,用來執行最後的截取操作。
當j <= 要截取的位元組數,變數K停止加1。
當j >= 要截取的位元組數,根據K返回截取後的結果。

看到別人的方法,都是最先將整個字串中的中文替換成雙位元組,然後判斷總長度是否大於需要截取的長度,如果大於再執行截取,而這樣無疑是低效的(如果需要截取的字串有1萬個字元,需要返回的是20個字元,同時返回20條記錄的話需要替換幾十萬次....),還要接下來再判斷是該截取幾位.....

轉自:http://www.cnblogs.com/asp600/archive/2006/10/16/530865.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.