js获取(包括中文)字符串长度与截取字符串

/**
 * @param begin 截取开始的索引
 * @param num 截取的长度
 */
//截取字符串(包括中文) 
function SetString(str, len) {
    var strlen = 0; 
    var s = "";
    for (var i = 0; i < str.length; i++) {
        var m =  str.charAt(i).match(/[^x00-x80]/g);//利用match方法检索出中文字符并返回一个存放中文的数
        if (m!=null && m.length>0) {
            strlen += 2;
        }
        else {
            strlen++;
        }
        s += str.charAt(i);
        if (strlen >= len) {
            return s;
        }
    }
    return s;
}

//得到字符总数
function getChars(str) {
    var i = 0;
    var c = 0.0;
    var unicode = 0;
    var len = 0;

    if (str == null || str == "") {
        return 0;
    }
    len = str.length;
    for(i = 0; i < len; i++) {
        unicode = str.charCodeAt(i);
        if (unicode < 127) { //判断是单字符还是双字符
            c += 1;
        } else {  //chinese
            c += 2;
        }
    }
    return c;
}

function sb_strlen(str) {
    return getChars(str);
}
//截取字符
function sb_substr(str, startp, endp) {
    var i=0; c = 0; unicode=0; rstr = '';
    var len = str.length;
    var sblen = sb_strlen(str);

    if (startp < 0) {
        startp = sblen + startp;
    }

    if (endp < 1) {
        endp = sblen + endp;// - ((str.charCodeAt(len-1) < 127) ? 1 : 2);
    }
    // 寻找起点
    for(i = 0; i < len; i++) {
        if (c >= startp) {
            break;
        }
        var unicode = str.charCodeAt(i);
        if (unicode < 127) {
            c += 1;
        } else {
            c += 2;
        }
    }

    // 开始取
    for(i = i; i < len; i++) {
        var unicode = str.charCodeAt(i);
        if (unicode < 127) {
            c += 1;
        } else {
            c += 2;
        }
        rstr += str.charAt(i);

        if (c >= endp) {
            break;
        }
    }

    return rstr;
}

function mb_strlen(str) {
    var len = 0;
    for(var i = 0; i < str.length; i++) {
        len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? (charset == 'utf-8' ? 3 : 2) : 1;
    }
    return len;
}
原文地址:https://www.cnblogs.com/michaelye/p/4449844.html