zoukankan      html  css  js  c++  java
  • C#中如何获取一个字符串的实际字符数

    在包含中文的字符串处理时,除了裁切固定长度的操作之外,有时也需要获取一个字符串的实际字符数,比如我们限制输入框字符数的时候。而C#提供的string.Length属性却无法满足我们的要求,由此,便有了下面这个方法:

    /// <summary>
    /// 获取字符串长度。与string.Length不同的是,该方法将中文作 2 个字符计算。
    /// </summary>
    /// <param name="str">目标字符串</param>
    /// <returns></returns>
    public static int GetLength(string str)
    {
        if (str == null || str.Length == 0) { return 0; }
    
        int l = str.Length;
        int realLen = l;
    
        #region 计算长度
        int clen = 0;//当前长度
        while (clen < l)
        {
            //每遇到一个中文,则将实际长度加一。
            if ((int)str[clen] > 128) { realLen++; }
            clen++;
        }
        #endregion
    
        return realLen;
    }

    在写上面那个方法时,我突然想到,如果把字符串转换成byte[]是不是也能获取到这个长度呢?姑且试试:

    public static int GetLength_Obsoleted(string str)
    {
        if (str == null || str.Length == 0) { return 0; }
        byte[] data = Encoding.Default.GetBytes(str);
        return data.Length;
    }

    这个方法也能够让我们如愿取到字符串长度。但这两个方法孰优孰劣呢?我使用了一句110字符长度的中文进行500万次调用测试,事实说话:

    GetLength

    GetLength 的执行效率几乎是 GetLength_Obsoleted 的 4 倍!

  • 相关阅读:
    C# 创建与读写配置文件
    C# 绘图三种方式
    WindowsForms获取服务名称
    Hbase之JAVA API不能远程访问问题解决
    Jenkins之自动构建
    Jenkins配置匿名用户拥有只读权限
    XShell中文乱码问题解决
    mybatis之关联(2)
    mybatis之动态SQL
    mybatis之一对一关联
  • 原文地址:https://www.cnblogs.com/uonun/p/1698978.html
Copyright © 2011-2022 走看看