转载 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. class Program
  11. {
  12. static int Main()
  13. {
  14. string testStr = "钱卓文 is 喵喵,贤静";
  15. //调用扩展方法
  16. string[] testArray = testStr.qzw();
  17. foreach (string s in testArray)
  18. {
  19. Console.WriteLine(s);
  20. }
  21. Console.ReadKey();
  22. return 0;
  23. }
  24. }

解决.net中截取字符串的汉字与数字还有静态扩展方法的更多相关文章

  1. SQL Server中截取字符串常用函数

    SQL Server 中截取字符串常用的函数: .LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截 ...

  2. LoadRunner中截取字符串

    LoadRunner中截取字符串 /*strchr和strrchr的区别*/ char *strTest1="citms citms"; char *strTest2,*strTe ...

  3. shell中截取字符串的方法总结

    shell中截取字符串的方法有很多种, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...

  4. SqlServer中截取字符串

    SQL Server 中截取字符串常用的函数: .LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截 ...

  5. SQL Server 中截取字符串常用的函数

    SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要 ...

  6. sql server中截取字符串的常用函数

    我们如果要在sql server中,使用截取字符串的方法要怎样使用呢? sql server提供了3个常用截取字符串方法,LEFT().RIGHT().SUBSTRING() /****** Sql ...

  7. (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)

    原文地址:解决fasterxml中string字符串转对象json格式错误问题 com.fasterxml.jackson.databind.ObjectMapper mapper = new com ...

  8. linux 中截取字符串

    shell中截取字符串的方法有很多中,${expression}一共有9种使用方法.${parameter:-word}${parameter:=word}${parameter:?word}${pa ...

  9. C#中截取字符串的几种方法

      1.根据单个分隔字符用split截取 例如 复制代码代码如下: string st="GT123_1"; string[] sArray=st.split("_&qu ...

随机推荐

  1. jenkins中Deploy to container Plugin插件发布配置

    参数详解: 第一项(WAR/EAR files):是war包的相对路径(相对于工作区路径,即在工作区中war包的相对路径.)如我的maven执行完成之后会在工作区的target目录下生成项目.war, ...

  2. android基础4——Mainifest

    众所周知,应用程序中的每一个UI都是通过Activity类的一个或者多个拓展实现的.在桌面开发环境中,Activity相当于Form,来布局和显示信息,以及影响用户的动作.Mainifest可以定义应 ...

  3. 【Daily】 2014-4-28

    KEEP GOING  表达产品想法, 探讨产品问题, 倾听可能性问题. 一次就做好, 有成果展示, 主动展示 先确立图, 后确立代码. Hold dream, and never let it go ...

  4. yum localinstall rpm

  5. javascript第六课类型转换

    1.parseint(参数): 转换为整数,即使参数中的字符串包含字母数字混合,此方法也会自动一个一个判断和转换   parseInt(参数,进制);将参数通过几进制的方式转为数字 2.parsefl ...

  6. 转发:为什么Android使用弱加密算法?

      Android 2.2.1默认使用的加密算法是AES 256-SHA1,但从2010年发布的Android 2.3开始,它默认使用的是一种更弱的加密算法 RC4-MD5. 当Android应用建立 ...

  7. Robotium双client測试框架

    互联网的本质就是信息交换.移动互联网更是如此, 所以很多移动互联网的服务类应用中有着身份地位不同的两种用户(比如:交易中的买家和卖家, 教学中的老师和学生, 打车中的车主和乘客).近期的工作是给公司的 ...

  8. Swift 设置navigation左右两侧按钮

    我们以设置右侧按钮为例,左侧方法类似 方法一,直接自定义文字 let item=UIBarButtonItem(title: "分享", style: UIBarButtonIte ...

  9. 警告框和操作表(IOS开发)

    警告框(AlertView)时模态的,不关闭它就不能做其它事情,所以不是下面几种情况不应该随便使用. 1.应用不能继续执行. 如内存不足,没有网络.一般仅仅须要一个button. 2.询问还有一个解决 ...

  10. AngularJs(三) deployd 服务的使用

    使用服务建立数据 在AngularJS(二)中,我搭建好了deployd服务,现在启动服务,创建正在的数据(开始是使用模拟数据),使用cmd命令 一.开启Mongodb数据. 贴图: 二:测试是否正常 ...