区分双单字节的字符长度统计函数charLen

区分双单字节的字符长度统计函数charLen

该函数实现了:
1、区分双单字节的字符长度的统计
2、能统计文本的总字节数
3、能统计单字节字数和双字节字数
4、能对文本长度进行截取

                <script>/*区分双单字节的字符长度统计函数片段 by:xxxily*/
function charLen(str,maxLen){
    var strInfo = {
                length:0, //字符串长度(不论单双字节,其最小长度单位都为1)
                len:0,    //文本长度(2个单字节文本才算1个单位长度的文本)
                byte:0,   //总字节数
                OBC:0,    //oneByteCount 单字节字数
                DBC:0,    //doubleByteCount 双字节字数
                str:""    //以文本长度[strInfo.len]截取后的文本(如果无截取则等于传入来的文本本身)
            },
            i = 0 ,
            para1 = (typeof str !== "undefined" && typeof str !== null),
            para2 = (typeof maxLen !== "undefined" && typeof maxLen !== null)
            ;
    if(!para1){return strInfo;}
    for (i ; i<str.length; i++){
        var c = str.charCodeAt(i);
        if ((c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f)){
                      //0xff60-0xff9f是日本片假名字符集 0x0001-0x007e ASCII码
            strInfo.byte++;
            strInfo.OBC++;
        }
        else{
            strInfo.byte+=2;
            strInfo.DBC++;
        }
        strInfo.len = Math.round(strInfo.DBC + (strInfo.OBC / 2)) ;
        if(para2 && strInfo.len > maxLen){
            strInfo.str = str.slice(0,i);
            break ;
        }
    }
      //修正循环导致的BUG
    if(str[i]){
        var c2 = str[i].charCodeAt(0) ;
        if((c2 >= 0x0001 && c2 <= 0x007e) || (0xff60<=c2 && c2<=0xff9f)){
            strInfo.OBC  -= 1;
            strInfo.byte -= 1 ;
        }
        else{
            strInfo.DBC  -= 1 ;
            strInfo.byte -= 2 ;
        }
        strInfo.len  -= 1 ;
    }
    strInfo.str === "" ? strInfo.str = str : {} ;
    strInfo.length = strInfo.str.length ;
    return strInfo;
}</script>