帶中文的字符串截取


最近在頁面展示的時候遇到這樣的場景,文字有可能超長,卻又不允許換行。

當然,可以用高超的css來搞定。但如果你想要讓多余的文字用“...”來代替,並且要兼容很多瀏覽器,這種時候用css也會很頭疼吧。

1.C#對中文字符串的截取

與英文字符相比,我們把中文字符按兩個占位來計算,對於帶中文的字符串截取,要面臨兩個問題:

1.無法截取半個中文字符;

2.對於除漢字以外的中文字符如何處理,比如:標點符號。

在這之前,可以先看看大神對 UTF-8、UTF-16以及UTF-32區別 的講解。

接下來,我們先來看一下C#的做法。

在C#中,Substring是最常用的字符串截取函數,但是這種截取通常一個中文字符只按一個位置計算。

比如:

“我是Lenmong楊”

截取5個字符就是:

"我是Len"

但其實,我這里想要的是:

“我是L”

在C#中還有很多辦法可以做到,介紹一種最簡便的方法,利用 System.Text.Encoding.Default 的 GetBytes 函數和 GetString 函數。

private string SubStrByByte(string str, int start, int length)
{
    int len = length;
    int byteCount = System.Text.Encoding.Default.GetByteCount(str);
    //修改最大長度,防止溢出
    if (len > byteCount)
    {
        len = byteCount;
    }
    var strBytes = System.Text.Encoding.Default.GetBytes(str);
    string substr = System.Text.Encoding.Default.GetString(strBytes, start, len);
    //對於半個中文字符的特殊處理
    if (substr.EndsWith("?"))
    {
        //判斷原字符串是否包含問號
        var c = str.Substring(substr.Length - 1, 1);
        if (!c.Equals("?"))
        {
            substr = substr.Substring(0, substr.Length - 1);
        }
    }
    return substr + "...";
}

 

注:在此,對於第一個問題中描述的情況,做了特殊處理。比如從字符串 “我是Lenmong楊” 中截取 1 個或者 3個字符,在這種情況下,由於一個中文字符占兩個位置,但我們不可能截取到半個中文字符,所以截取的結果是 "?"或者 “我?”。無法截取的那個中文被"?"代替。

所以我在最后判斷了一下,如果截取結果是以"?"結尾,那么就去掉"?",但如果原字符串本身就有問號(英文),那么做就不去掉問號。

對於除了漢字以外的中文字符的處理,此處未作特殊處理。

網上還有幾種其他的辦法,不再贅述。

Javascript對於帶中文字符串的截取

 獲取byte長度

String.prototype.byteLength = function() {
    var str = this,
        strLen = 0;
    for(var i = 0; i < str.length; i++) {
        strLen += str.charAt(i).match(/[^\x00-\xff]/ig) ? 2 : 1;
    }
    return strLen;
};

 

截取一定長度

String.prototype.substrByByte = function(start, length) {

    var str = this,
        strLen = str.byteLength(),
        subLen = 0,
        substr = "";
    if(length < 1 || length > strLen) throw new Error("參數不正確");
    for(var i = 0; i < str.length; i++) {
        subLen += str.charAt(i).match(/[^\x00-\xff]/ig) ? 2 : 1;
        if(length <= subLen) {
            substr = str.slice(0, i + 1) + ((length == strLen) ? "" : "...");
            break;
        }
    }
    return substr;
};

 

 在截取字符串的時候,不足一個漢字的按一個漢字計算。

被截取的部分顯示'...'。

 后半段寫的有點匆忙,臨時有些事情處理,后面有時間再來更新吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM