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