首页 > 代码库 > 解决.net中截取字符串的汉字与数字还有静态扩展方法

解决.net中截取字符串的汉字与数字还有静态扩展方法

 

 

转载 http://blog.163.com/cn_dreamgo/blog/static/52679452200961033212407/
这两天在C#编程中应用到C#代码与C的代码信息交互,但是在信息获取的过程发现当字符串中存在中文汉字时,两种代码下获取的字符串长度不相同。查找原因为:C#中使用的unicode编码格式,默认一个汉字为一个字符。例如:
    str1 = "测试";
在C#中使用str1.length的到的长度是2,在C中strlen()得到的长度是4;这样在字符长处理中就遇到了问题。
在C编写的程序中传输一段中英文混合的固定长度20字节的字符串给C#编写的程序,不足的位数补空字符。当在C#中进行字符串截取时,由于存在汉字问题,导致截取位数出现错误,获取的信息也同样错误。
    C传输字符串:"A这是一个测试代码段 B这是测试代码段2    C这是测试代码段3    "
    C#中要截取得到每段字符串,使用str.Substring(0,20) 得到字符串是:"A这是一个测试代码段 B这是测试代码段2"而不是所需要"A这是一个测试代码段 "。
    为此,我编写了下面的小函数来代替原来的Substring实现获取从指定位置开始指定长度的字符段。
 ///
        /// 获取字符串中指定位置开始的指定长度的字符串,支持汉字英文混合 汉字为2字节计数
        ///
        /// 输入中英混合字符串
        /// 开始截取的起始位置
        /// 要截取的字符串长度
        ///
        public static HtmlString SubNick(string strSub, int start, int length)
        {
            string temp = strSub;
            int j = 0, k = 0, p = 0;
            CharEnumerator ce = temp.GetEnumerator();
            while (ce.MoveNext())
            {
                j += (ce.Current > 0 && ce.Current < 255) ? 1 : 2;
                if (j <= start)
                {
                    p++;
                }
                else
                {
                    if (j == GetLength(temp))
                    {
                        temp = temp.Substring(p, k + 1);
                        break;
                    }
                    if (j <= length + start)
                    {
                        k++;
                    }
                    else
                    {
                        temp = temp.Substring(p, k);
                        break;
                    }
                }
            }
            return new HtmlString(temp);
        }
        ///
        /// 获取指定字符串长度,汉字以2字节计算
        ///
        /// 要统计的字符串
        ///
        private static int GetLength(String aOrgStr)
        {
            int intLen = aOrgStr.Length;
            int i;
            char[] chars = aOrgStr.ToCharArray();
            for (i = 0; i < chars.Length; i++)
            {
                if (System.Convert.ToInt32(chars[i]) > 255)
                {
                    intLen++;
                }
            }
            return intLen;
        }

==========================================================================

扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

扩展方法的要求如下:

1  第一个参数是要扩展或者要操作的类型,这称为"被扩展的类型"

2  为了指定扩展方法,要在被扩展的类型名称前面附加this修饰符

3  要将方法作为一个扩展方法来访问,要用using指令导入扩展类型的命名空间,或者使扩展类型和调用代码在同一个命名空间中.

如果扩展方法的签名已经和被扩展类型中的一个签名匹配 扩展方法永远不会得到调用,除非是作为一个普通的静态方法

扩展方法无法帮助我们建立一个清楚的版本控制机制,因为一旦在被扩展的类型中添加一个匹配的签名,就会将现有的扩展方法覆盖,而且不会发出任何警告. 如果对被扩展的类的源代码没有控制权,这个问题还会变得更加突出   (猫的理解是很容易出现匹配冲突所导致的结果吧)

Code:
  1. //扩展方法必须在非泛型静态类中定义  
  2.    public static class qzwtest  
  3.    {  
  4.        //扩展方法  
  5.        public static string[] qzw(this string str)  
  6.        {  
  7.            return str.Split(new char[] { ‘ ‘, ‘,‘ });  
  8.        }  
  9.    }  
  10.   
  11.    class Program  
  12.    {  
  13.        static int Main()  
  14.        {  
  15.   
  16.            string testStr = "钱卓文 is 喵喵,贤静";  
  17.            //调用扩展方法  
  18.            string[] testArray = testStr.qzw();  
  19.            foreach (string s in testArray)  
  20.            {  
  21.                Console.WriteLine(s);  
  22.            }  
  23.   
  24.            Console.ReadKey();  
  25.            return 0;  
  26.        }  
  27.    }  

 

 

解决.net中截取字符串的汉字与数字还有静态扩展方法