截取字符串长度问题。
遇到一个问题,英文长度跟中文长度差了一半。效果很不好。怎么解决啊。
<%#function.GetLeft(Eval("typename").ToString(), 12)%>
public static string GetLeft(string content, int count)
{
if (content.Length > count)
{
content = content.Substring(0, count);
}
else
{
content = content.ToString();
}
return content;
}
[解决办法]
改成这样更准确一点(包含中文标点):
public static string GetLeft(string content, int count)
{
return Regex.Match("sdd字符3adfsd", @"^([\u4e00-\u9fa5
[解决办法]
”
[解决办法]
“
[解决办法]
;
[解决办法]
:
[解决办法]
。
[解决办法]
,!
[解决办法]
?]
[解决办法]
\S{1,2}){1,"+count+"}").Value;
}
不过测试发现,如果前面的单字节字符个数是奇数的话,最终的结果就是多了一个单字节字符,比如上面的结果如果count是4的话,返回的就是“sdd字符3a”,这也似乎没好的办法。
[解决办法]
public static string GetLeft(string str, int length)
{
if (str == null)
return string.Empty;
int len = length * 2;
int j = 0, k = 0;
Encoding encoding = Encoding.GetEncoding("gb2312");
for (int i = 0; i < str.Length; i++)
{
byte[] bytes = encoding.GetBytes(str.Substring(i, 1));
if (bytes.Length == 2)//不是英文
j += 2;
else
j++;
if (j <= len)
k += 1;
if (j >= len)
return str.Substring(0, k) + "...";
}
return str;
}
经测试,可以用。