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 倍!

  • 相关阅读:
    Spring-Boot:多种配置注入方式
    Spring-Boot:Profile简单示例
    Spring-Boot:拦截器注解范例
    Docker:镜像的迁移
    YARN的内存和CPU配置
    Spark On YARN内存分配
    Spark配置参数
    linux_密钥
    分布式架构高可用架构篇_04_Keepalived+Nginx实现高可用Web负载均衡
    PythonDay01
  • 原文地址:https://www.cnblogs.com/uonun/p/1698978.html
Copyright © 2011-2022 走看看