我的博客

asp.net 自学笔记及开发过程中的经验、技巧、摘录
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用C#截取指定长度的中英文混合字符串的最终算法

Posted on 2007-08-28 09:30  Net_Learner  阅读(832)  评论(1编辑  收藏  举报
去年的时候由于工作需要,写了个用C#截取指定长度的方法,当时颇费了一番周折,因为想错了方向。
例如要截取字符串"我是1个中国人",取3位长度,那得到的结果是"我",如果取6位长度,得到的结果是"我是1",因为汉字是两个字节。
当时的思路主要是考虑最后一位是单字节还是双字节,不过最终得出了比较不错的方法,只是这方法后来却找不到了,重新写一个又太懒,想或许到Google上能搜索到,但是可惜的是,搜索到的方法几乎都有问题,不单是效率,还有结果都不能正常显示,有的文章甚至被不少大网站互相转来转去,呀,没有人调试过吗?

拿出时间来自己写一个,大家看代码:
 
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;
    }


具体思路是,定义两个变量:j 与K,例如要截取字符串"我是1个中国人",取3位长度,从第一个字符开始判断——temp.Substring(i, 1),如果是双字节j+2,否则加1,而变量K则每次循环加1,用来执行最后的截取操作。
当j <= 要截取的字节数,变量K停止加1。
当j >= 要截取的字节数,根据K返回截取后的结果。

看到别人的方法,都是最先将整个字符串中的中文替换成双字节,然后判断总长度是否大于需要截取的长度,如果大于再执行截取,而这样无疑是低效的(如果需要截取的字符串有1万个字符,需要返回的是20个字符,同时返回20条记录的话需要替换几十万次....),还要接下来再判断是该截取几位.....

转自:http://www.cnblogs.com/asp600/archive/2006/10/16/530865.aspx