场景:
js中String类型自带的属性length获取的是字符串的字符数目,但是前端经常会需要限制字符串的显示长度,一个中文字符又大概占两个英文小写字符的显示位置,所以中英文混合的情况下用length值来判断显示长度往往并不正确。
常规的解决办法是遍历字符串,中文字符计长度2,非中文字符计长度1,通过新计算出来长度总和来限制字符串的显示长度。看代码↓↓↓
中文
hasZh: function(str){
for(var i = 0;i < str.length; i++)
{
if(str.charCodeAt(i) > 255) //如果是汉字,则字符串长度加2
return true;
return false;
}
},//重新计算长度,中文+2,英文+1
getlen: function(str){
var strlen = 0;
for(var i = 0;i < str.length; i++)
{
if(str.charCodeAt(i) > 255) //如果是汉字,则字符串长度加2
strlen += 2;
else
strlen++;
}
return strlen;
},//限制长度
limitlen: function(str,len){
var result = "";
var strlen = 0;
for(var i = 0;i < str.length; i++)
{
if(str.charCodeAt(i) > 255) //如果是汉字,则字符串长度加2
strlen += 2;
else
strlen++;
result += str.substr(i,1);
if(strlen >= len){
break;
}
}
return result;
}
}
这种方法的原理是根据中英文的unicode编码范围不同来判断的,中文占2个字节,英文占1个字节,所以中文的unicode编码值肯定大于2^8-1=255。
上述方法可以更严谨一点:就是考虑unicode编码范围,具体的范围可以戳
PS:
汉字的unicode编码范围16进制为4E00-9FA5,10进制则为:19968-40869,即判断中文的准确表达式为:=19968 && str.charCodeAt(i)<=40869