您当前的位置:KKBlog > 学无止境 > ASP.NET

C# 字符串截取指定长度的中文字符,绝对够简单

通常,一个中文会占两个字节的空间。很多语言里,一个中文字符就算是2个字符长度。

但在C#中,string里包含的中文字符只占一个字符长度。这就导致很多时候,使用string.SubString(int startIndex,int length)方法来截取字符会错位。

最近由于工作原因,会截取指定长度的字符来使用。但是在文档里,1个中文是2个长度来计算。刚开始还只是以为文档错误,后来才知道是由于C#的差异造成的。

刚开始,是直接到网上找算法,但是找到的算法,基本思路都是挨个字符判断(根据ASCII值)。不是算法复杂,就是容易出错,且不能涵盖所有的中文。

稍微研究了下,还是利用.Net框架自带的方法最简单。

基本思路如下,将string转化为byte[] ,将byte[]截取后,再转化为string ,这种方法,两步完成,且可谓万无一失。

/// <summary>
/// 截取字符串,解决中文在c#字符串中占一个字符长度
/// </summary>
/// <param name="toSub">被截取的字符串</param>
/// <param name="startIndex">起始位置(0开始)</param>
/// <param name="length">截取的长度</param>
/// <returns></returns>
public static string SubString(string toSub, int startIndex, int length)
{
    byte[] subbyte = System.Text.Encoding.Default.GetBytes(toSub);
    string Sub = toSub;
    if (length > 0 && subbyte.Length > length)
    {
        Sub = System.Text.Encoding.Default.GetString(subbyte, startIndex, length);
    }
    return Sub;
}

用法基本和string.SubString(int startIndex,int length)一样。

=====================  JS 写法 ====================================================

//计算字符串长度
String.prototype.strLen = function() {
    var len = 0;
    for (var i = 0; i < this.length; i++{
        if (this.charCodeAt(i) > 255 || this.charCodeAt(i) < 0) len += 2else len ++;
    }

    return len;
}

//将字符串拆成字符,并存到数组中
String.prototype.strToChars = function(){
    var chars = new Array();
    for (var i = 0; i < this.length; i++){
        chars[i] = [this.substr(i, 1), this.isCHS(i)];
    }

    String.prototype.charsArray = chars;
    return chars;
}

//判断某个字符是否是汉字
String.prototype.isCHS = function(i){
    if (this.charCodeAt(i) > 255 || this.charCodeAt(i) < 0
        return true;
    else
        return false;
}

//截取字符串(从start字节到end字节)
String.prototype.subCHString = function(start, end){
    var len = 0;
    var str = "";
    this.strToChars();
    for (var i = 0; i < this.length; i++{
        if(this.charsArray[i][1])
            len += 2;
        else
            len++;
        if (end < len)
            return str+"…";
        else if (start < len)
            str += this.charsArray[i][0];
    }

    return str;
}

//截取字符串(从start字节截取length个字节)
String.prototype.subCHStr = function(start, length){
    return this.subCHString(start, start + length);
}

 

 

 
二维码
意见反馈 二维码