1. 程式人生 > >帶中文的字串擷取

帶中文的字串擷取

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

當然,可以用高超的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;
};

 

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

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

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