C# 字符串截取指定长度的中文字符,绝对够简单
通常,一个中文会占两个字节的空间。很多语言里,一个中文字符就算是2个字符长度。
但在C#中,string里包含的中文字符只占一个字符长度。这就导致很多时候,使用string.SubString(int startIndex,int length)方法来截取字符会错位。
最近由于工作原因,会截取指定长度的字符来使用。但是在文档里,1个中文是2个长度来计算。刚开始还只是以为文档错误,后来才知道是由于C#的差异造成的。
刚开始,是直接到网上找算法,但是找到的算法,基本思路都是挨个字符判断(根据ASCII值)。不是算法复杂,就是容易出错,且不能涵盖所有的中文。
稍微研究了下,还是利用.Net框架自带的方法最简单。
基本思路如下,将string转化为byte[] ,将byte[]截取后,再转化为string ,这种方法,两步完成,且可谓万无一失。
/// </summary>
用法基本和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 += 2; else 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);
}
