前端开发中常需限制中英文混合字符串的显示长度,因中文字符占用空间约为英文字符的两倍,直接使用length属性会导致显示错误。本文介绍通过遍历字符串并依据Unicode编码判断字符类型,将中文字符计为2、英文字符计为1来计算实际长度,并提供相应的截取代码实现。
中英文混合字符串长度计算问题
场景:
在JavaScript中,String类型自带的length属性返回的是字符串的字符数量。然而在前端开发中,经常需要限制字符串的显示长度。由于一个中文字符在视觉上大约占据两个英文小写字母的位置,因此在包含中英文混合内容的情况下,直接利用length值来判断显示长度往往是不准确的。
常规的解决办法是遍历字符串,中文字符计长度2,非中文字符计长度1,通过新计算出来长度总和来限制字符串的显示长度。看代码↓↓↓
基于Unicode编码的长度计算实现
var Tools ={
//是否包含中文
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编码范围,具体的范围可以戳Unicode Table
PS: 汉字的unicode编码范围16进制为4E00-9FA5,10进制则为:19968-40869,即判断中文的准确表达式为:
精确判断中文的Unicode范围
str.charCodeAt(i)>=19968 && str.charCodeAt(i)<=40869
插一句不太严谨的话,代码不用限制太严谨的范围,毕竟你不知道用户(测试)会输哪些奇怪的东西。
以上这篇js处理包含中文的字符串实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。