【分享+原创+散分】高效中英文字符串截取方法

NqIceCoffee 2009-04-02 10:47:21
加精
public static string Intercept(string input, int p)
{
Encoding encode = Encoding.GetEncoding("gb2312");
byte[] byteArr = encode.GetBytes(input);
if (byteArr.Length <= p) return input;

int m = 0, n = 0;
foreach (byte b in byteArr)
{
if (n >= p) break;
if (b > 127) m++; //重要一步:对前p个字节中的值大于127的字符进行统计
n++;
}
if (m % 2 != 0) n = p + 1; //如果非偶:则说明末尾为双字节字符,截取位数加1

return encode.GetString(byteArr, 0, n);
}


测试代码:
Console.WriteLine(Intercept("ABC中国人", 7));
Console.WriteLine(Intercept("ABCD中国人", 7));
Console.WriteLine(Intercept("ABC中D国人", 7));


在网上也发现了一些截取函数,但大都使用正则或者字符串的截取,方法性能相对低下

今天看了一些关于.NET编码的文章,于是有了今天的方法,其实原理很简单,不过没见网上有过。

所以拿来分享~

大牛们表笑话我哈

另:没经过严格测试,如果有BUG,请跟贴,谢谢~~
...全文
4954 269 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
269 条回复
切换为时间正序
请发表友善的回复…
发表回复
y2b8f 2010-07-30
  • 打赏
  • 举报
回复
我要看69楼DE
hixiangni555 2010-07-29
  • 打赏
  • 举报
回复
学习了
binlan2008 2010-07-28
  • 打赏
  • 举报
回复
不错,顶啊
shaluo520 2010-05-04
  • 打赏
  • 举报
回复
学习```
jdc1989 2010-05-01
  • 打赏
  • 举报
回复
。。。。。。。。。。。。。。。。。。。。。。。。。。。
熊霸天 2009-11-27
  • 打赏
  • 举报
回复
Truncate1(str, 10):一条Sql语
Truncate2(str, 10):一条Sql语句
Truncate3(str, 10):一条Sql语句
Truncate (str, 10) :一条Sql语

--------------------------------------------
纯属娱乐
熊霸天 2009-11-27
  • 打赏
  • 举报
回复

1、一般的处理方式:
public static string Truncate1(string str, int len)
{
int w = 0;
string s = "";
for (int i = 0; i < str.Length; i++)
{
char c = str[i];
if ((int)c >= 0xFF)
w += 2;
else
w += 1;

if (w > len)
break;
s += c;
}
return s;
}

2、#69楼的处理方式:
public static string Truncate2(string original, int length)
{
int len = original.Length;
int i = 0;
for (; i < length && i < len; ++i)
{
if ((int)(original[i]) > 0xFF)
--length;
}
if (length < i)
length = i;
else if (length > len)
length = len;
return original.Substring(0, length);
}

3、#187楼的处理方式:
public static string Truncate3(string input, int length)
{
int count = input.Length;
int index = 0;
while (length > 0 && index < count)
{
length -= (((((int)input[index++]) & 0xff00) + 0x1ffff) >> 16);
}
return input.Substring(0, index);
}

#69楼的思路值得鉴赏、#138楼的运行最快

但是在字符串中含有奇数ASCII字符的时候,以上两个方法可能多截取一个字符;

string str = "一条Sql语句:取出表A中第31到第40记录";

Truncate1:一条Sql语
Truncate2:一条Sql语句
Truncate3:一条Sql语句
Truncate :一条Sql语


4、参照#69楼写的一个函数
public static string Truncate(string str, int len)
{
int l = str.Length;

for (int i=0 ; i < l && i < len; i++ )
{
if (str[i]> 0xFF)
len--;
}

if (l < len)
return str;

return str.Substring(0,len);
}
jasonhuahua 2009-04-12
  • 打赏
  • 举报
回复
学习
delphi45 2009-04-12
  • 打赏
  • 举报
回复
不错,不错!
matee 2009-04-12
  • 打赏
  • 举报
回复
站位 今后学习
ChinaITOldMan 2009-04-12
  • 打赏
  • 举报
回复
xuexi
silentboy1013 2009-04-12
  • 打赏
  • 举报
回复
学习中
ywdch 2009-04-11
  • 打赏
  • 举报
回复
支持一下
果然如此 2009-04-11
  • 打赏
  • 举报
回复
学习
makun0624 2009-04-11
  • 打赏
  • 举报
回复
MARK!
尐孑 2009-04-11
  • 打赏
  • 举报
回复
学习一下
pgameli 2009-04-11
  • 打赏
  • 举报
回复
感谢lz分享
帮顶
ahwangyibo 2009-04-11
  • 打赏
  • 举报
回复
up
jscn123789abc 2009-04-10
  • 打赏
  • 举报
回复
ding...
breezes2008 2009-04-10
  • 打赏
  • 举报
回复
支持
加载更多回复(245)

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧