区分双单字节的字符长度统计函数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>