C#截取指定长度中英文字符串方法 (收藏)

本文介绍了一种在C#中实现对中英文混合字符串按特定长度截取的方法,通过计算中文字符占用两个位置来确保截取后的字符串符合设定的长度,并在超出长度时添加省略号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

string s = "iam方枪枪";
int len = s.Length;//will output as 6
byte[] sarr = System.Text.Encoding.Default.GetBytes(s);
len = sarr.Length;//will output as 3+3*2=9


public
  static   string  GetFirstString( string  stringToSub,  int  length) 
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            Regex regex 
= new Regex("[\u4e00-\u9fa5]+", RegexOptions.Compiled);
InBlock.gif            
char[] stringChar = stringToSub.ToCharArray();
InBlock.gif            StringBuilder sb 
= new StringBuilder();
InBlock.gif            
int nLength = 0;
InBlock.gif            
bool isCut=false;
InBlock.gif            
for(int i = 0; i < stringChar.Length; i++
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (regex.IsMatch((stringChar[i]).ToString())) 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    sb.Append(stringChar[i]);
InBlock.gif                    nLength 
+= 2;
ExpandedSubBlockEnd.gif                }

InBlock.gif                
else 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    sb.Append(stringChar[i]);
InBlock.gif                    nLength 
= nLength + 1;
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
if (nLength > length)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    isCut
=true;
InBlock.gif                    
break;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
if(isCut)
InBlock.gif                
return sb.ToString()+"..";
InBlock.gif            
else
InBlock.gif                
return sb.ToString();
ExpandedBlockEnd.gif        }


我是从网上找的方法,然后添加了,如果是超过长度,则在后面添加".."字符。

这在做网站时,显示新闻标题最非常有用,为了保持页面的格局,对标题进行限定长度,这就需要对中文进行双字符计算。

Feedback

# re: C#截取指定长度中英文字符串方法  回复   

2005-09-30 10:20 by 垃圾猪
不错,也可以不使用正则表达式
把每个字转为byte[]
如果byte有高低位那就是2个位置
这样也同时适应其它(其它语言)占2个位置的字

# re: C#截取指定长度中英文字符串方法  回复   

2005-10-06 14:04 by 宝剑·123钢铁·123steel.cn
ss使用这样的办法也可以控制显示:
============================
<style>
#idDIV{width:100%;height:90px;background-color:#87CEEB;padding:8px;overflow:hidden; text-overflow:ellipsis;white-space:nowrap; }
#idCodeDiv{width:100%;padding:4px;font-family:verdana,tahoma;margin:12px 0px 0px 0px;background-color:#EEEEEE;font-weight:bold;}
</style>

<script>
function rdl_change(e){
var oCodeDiv=document.all("idCodeDiv");
var oDiv=document.all("idDiv");
with (document.all("idSel1")) var sValue1=options[selectedIndex].value;
with (document.all("idSel2")) var sValue2=options[selectedIndex].value;
with (oDiv.style) {
overflow=sValue1;textOverflow=sValue2;
}
oCodeDiv.innerText="overflow : "+sValue1+"\r\n"+"text-overflow : "+sValue2+" ;";
}
</script>

<div id=idDIV>请您从下面的选择框中选择这段文字的相应属性的值。看一看会发生什么,然后您就会明白他们的意义。</div>
<br>
<table><tr><td>
<select id="idSel1" onchange="rdl_change();">
<option value="hidden">---overflow---
<option value="hidden">hidden
<option value="visible">visible
</select>
</td><td>
<select id="idSel2" onchange="rdl_change();">
<option value="clip">---text-overflow---
<option value="clip">clip
<option value="ellipsis" selected>ellipsis
</select>
</td></tr></table>
<div id=idCodeDiv>overflow : ellipsis ;<br>text-overflow : hidden ;</div>

# re: C#截取指定长度中英文字符串方法  回复   

2005-10-09 15:25 by XiaoHui
看到以上的代码,觉得很眼熟...呵呵

http://xiaohui.cnblogs.com/archive/2004/10/23/55868.html

评论里面,破宝指出有更多的中文字符集.

# re: C#截取指定长度中英文字符串方法  回复   

2005-10-26 13:26 by 破宝
从 Google 搜索我的名字,又回来看看,现在我的新办法是:

Encoding encoding = Encoding.GetEncoding("gb2312");
// 这种方法在不同语言的 OS 上都比较好,其他字符集也方便修改;
// 如果是中文 OS,也可以用 Encoding.Default 代替。

int bytesSize = encoding.GetByte("破宝(percyboy)").Length;
// 上面的表达式即该字符串在 gb2312 字符集中的字节数。
// 用这个修正你的代码,可以做个测试,
// 我估计应该会比正则表达式快一些。

# re: C#截取指定长度中英文字符串方法  回复   

2006-03-26 22:43 by laifangsong
GetFirstString("ab我", 3)

输出的是 ab我.. ,好像不是想要的。

感觉这样更好。

public static string GetFirstString(string stringToSub, int length)
{
Regex regex = new Regex("[\u4e00-\u9fa5]+", RegexOptions.Compiled);
char[] stringChar = stringToSub.ToCharArray();
StringBuilder sb = new StringBuilder();
int nLength = 0;
for(int i = 0; i < stringChar.Length; i++)
{
if (regex.IsMatch((stringChar[i]).ToString()))
{
nLength += 2;
}
else
{
nLength = nLength + 1;
}

if (nLength <= length)
{
sb.Append(stringChar[i]);
}
else
{
break;
}
}
if(sb.ToString() != stringToSub)
{
sb.Append("...");
}
return sb.ToString();
}

转载于:https://www.cnblogs.com/fanrsh/archive/2006/06/06/418425.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值