帶中文的字串擷取
阿新 • • 發佈:2018-11-26
最近在頁面展示的時候遇到這樣的場景,文字有可能超長,卻又不允許換行。
當然,可以用高超的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; };
在擷取字串的時候,不足一個漢字的按一個漢字計算。
被擷取的部分顯示'...'。
後半段寫的有點匆忙,臨時有些事情處理,後面有時間再來更新吧。