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)








































我是从网上找的方法,然后添加了,如果是超过长度,则在后面添加".."字符。
这在做网站时,显示新闻标题最非常有用,为了保持页面的格局,对标题进行限定长度,这就需要对中文进行双字符计算。
Feedback
不错,也可以不使用正则表达式
把每个字转为byte[]
如果byte有高低位那就是2个位置
这样也同时适应其它(其它语言)占2个位置的字
把每个字转为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>
============================
<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>
从 Google 搜索我的名字,又回来看看,现在我的新办法是:
Encoding encoding = Encoding.GetEncoding("gb2312");
// 这种方法在不同语言的 OS 上都比较好,其他字符集也方便修改;
// 如果是中文 OS,也可以用 Encoding.Default 代替。
int bytesSize = encoding.GetByte("破宝(percyboy)").Length;
// 上面的表达式即该字符串在 gb2312 字符集中的字节数。
// 用这个修正你的代码,可以做个测试,
// 我估计应该会比正则表达式快一些。
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();
}
输出的是 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();
}