代码改变世界

C#中如何获取一个字符串的实际字符数

2010-03-28 18:32  uonun  阅读(2939)  评论(0编辑  收藏  举报

在包含中文的字符串处理时,除了裁切固定长度的操作之外,有时也需要获取一个字符串的实际字符数,比如我们限制输入框字符数的时候。而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 倍!