最近在页面展示的时候遇到这样的场景,文字有可能超长,却又不允许换行。
当然,可以用高超的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; };
在截取字符串的时候,不足一个汉字的按一个汉字计算。
被截取的部分显示'...'。
后半段写的有点匆忙,临时有些事情处理,后面有时间再来更新吧。