我们常做的一件事情,就是在文章系统中,截取一定长度的文章标题,超过指定长度,就加“...”

如两个字符串:
string str1 = "中国人要啊abc呀~";
string str2 = "1中国人23456abc呀~";

要截取后,输出:

str1 = "中国人要...";
str2 = "1中国人2...";

即要把中英文混合的字符串,在截取后,长度要一致,即8个字节的长度(不包括三个点),而且不能出现中文被从中间截断的情况。于是写了个方法:

using System.Text.RegularExpressions;

//
public static string getStr(string s,int l)
    {    
    
string temp = s ;
    
if (Regex.Replace(temp,"[\u4e00-\u9fa5]","zz",RegexOptions.IgnoreCase).Length<=l)
    {
        
return temp;
    }
    
for (int i=temp.Length;i>=0;i--)
    {
        temp 
= temp.Substring(0,i);
        
if (Regex.Replace(temp,"[\u4e00-\u9fa5]","zz",RegexOptions.IgnoreCase).Length<=l-3)
        {
            
return temp + "";
        }    
    }
    
return "";
    }

调用:
string content = "中国人啊abc呀呀呀呀";
content 
= getStr(content,13);

2008-03-06:
用C#截取指定长度的中英文混合字符串 改进版>>

posted on 2006-07-04 23:54 三千 阅读(2927) 评论(17)  编辑 收藏 所属分类: [E]. C#

评论:
#1楼  2006-07-05 01:30 | Icebird      
如果是ASP.NET,可以很方便的用CSS的属性控制
如果是Windows Form,似乎有Windows API可以用来做类似的事
  回复  引用  查看    
#2楼  2006-07-05 08:45 | chill [未注册用户]
如果是ASP.NET,可以很方便的用CSS的属性控制
不知道是如何控件?能否给出示例?不要光说不练.
  回复  引用  查看    
#4楼  2006-07-05 09:50 | 小朱      
不错,我一般是在数据库中进行处理的,详细察看:http://zsy.cnblogs.com/archive/2006/07/05/443034.html
  回复  引用  查看    
#5楼  2006-07-05 10:08 | 高海东      
不错
  回复  引用  查看    
#6楼 [楼主] 2006-07-05 11:35 | YAO.NET℡      
@Icebird
css那个着实简单。但是IE专有属性,Firefox中不显示省略号。

我贴过来:

<DIV STYLE="width: 120px; height: 50px; border: 1px solid blue;
overflow: hidden; text-overflow:ellipsis">
<NOBR>就是比如有一行文字,很长,表格内一行显示不下.</NOBR>
</DIV>

---------------------------------------------------

text-overflow

版本:IE6+专有属性 

继承性:无

语法:
text-overflow : clip | ellipsis

参数:
clip :  不显示省略标记(...),而是简单的裁切
ellipsis :  当对象内文本溢出时显示省略标记(...)

说明:
设置或检索是否使用一个省略标记(...)标示对象内文本的溢出。
对应的脚本特性为textOverflow。

示例:
div { text-overflow : clip; }
  回复  引用  查看    
#7楼  2006-07-06 10:23 | 尧尧      
没必要挑剔了啊,IE能用就OK了.
  回复  引用  查看    
#8楼  2006-08-31 12:01 | fyz [未注册用户]
/// <summary>
/// 截取字符
/// </summary>
/// <param name="txt">文字</param>
/// <param name="lenght">长度</param>
/// <returns>返回字符</returns>
public static string text(string txt, int lenght)
{
string outputtext = "";
if (txt.Length > lenght)
{
int tempnum = 0;
byte[] byitem = ASCIIEncoding.ASCII.GetBytes(txt);
for (int i = 0; i < txt.Length; i++)
{
if ((int)byitem[i] == 63) tempnum += 2; else tempnum += 1;
outputtext += txt.Substring(i,1);
if (tempnum == lenght) break;
}

outputtext += "…";

}
else
{
outputtext = txt;
}
return outputtext;
}
  回复  引用  查看    
#9楼  2006-10-14 00:42 | 剑气潇潇      
楼主的方法和fyz 的都有问题吧 ?

试一下:
string content = "中国aaa";截取3位


  回复  引用  查看    
#10楼 [楼主] 2006-10-16 09:31 | YAO.NET℡      
@剑气潇潇

getStr(string s,int l)方法第二个参数是字节数,即要返回多少长度字节的字符串。这里头我把三个点也算在长度内了。因为三个点也占位了。

所以
"string content = "中国aaa";截取3位 "

包括截取4位时,都返回"..."
只有截取5位时,返回"中..."

这个问题应该是需求的问题,就是当要求返回字符串很短的情况下(甚至比省略号的长度还短),如何处理显示效果。

如果不加三点省略号,那么加二点或一点似乎都不合中文习惯,要么不加省略号?那也不能反应出标题超过长度了,或者提醒用户这儿的内容未显示完全。

回过头来再看,大多数情况下。这种情况很少发生,我想很少有页面要求标题长度只截四个或少于四个长度的。要让显示效果看起来正常,那就只能干脆不加省略号了。
  回复  引用  查看    
#11楼  2006-10-16 20:11 | 剑气潇潇      
楼主别急,试一下:
getStr("中国1中国中国中1111中国", 23)

getStr("中国1中国中国中1111中国中国", 23)
  回复  引用  查看    
#12楼  2006-10-16 21:56 | 剑气潇潇      
public static string getSubString(string str, int length)
{
string temp = str;

int j = 0;
int k = 0;
for (int i = 0; i < temp.Length; i++)
{
if (Regex.IsMatch(temp.Substring(i, 1), @"[\u4e00-\u9fa5]+"))
{
j += 2;
}
else
{
j += 1;
}
if (j <= length)
{
k += 1;
}
if (j >= length)
{
return temp.Substring(0, k);
}
}
return temp;
}
  回复  引用  查看    
#13楼 [楼主] 2006-10-19 09:53 | YAO.NET℡      
@剑气潇潇

晕,测了你发的方法,我的就是多了省略号功能,其它没看出区别,截了个图在这儿,你看看:

http://www.cnblogs.com/images/cnblogs_com/yao/getStr.jpg
  回复  引用  查看    
#14楼 [楼主] 2006-10-19 15:20 | YAO.NET℡      
getStr("中国1中国中国中1111中国", 23)
中的字符串"中国1中国中国中1111中国"本身长度就是23,所以刚好返回他本身。

getStr("中国1中国中国中1111中国中国", 23)
中的字符串长度为27,如果取掉最后两个字"中国"刚好为23,因为总长度27超过了要求长度23,所以需要减字后加省略号,且加了省略号后,长度也不能超过23,所以"中国1中国中国中1111中国中国"先减去两个字后是"中国1中国中国中1111中国"刚好为23长,再减二个汉字来放省略号,即最终结果为"中国1中国中国中1111..."
  回复  引用  查看    
#15楼  2006-10-30 17:39 | abc007 [未注册用户]
搂主的方法根本不行啊,完整的方法大家可以参考:
http://www.vs2005-css.cn/Article/Web-biancheng/C(CSharp)/C-jishuwendang/2006-10-25/200610250945480.html
  回复  引用  查看