js处理包含中文的字符串

场景:

js中String类型自带的属性length获取的是字符串的字符数目,但是前端经常会需要限制字符串的显示长度,一个中文字符又大概占两个英文小写字符的显示位置,所以中英文混合的情况下用length值来判断显示长度往往并不正确。

常规的解决办法是遍历字符串,中文字符计长度2,非中文字符计长度1,通过新计算出来长度总和来限制字符串的显示长度。看代码↓↓↓

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,即判断中文的准确表达式为:

str.charCodeAt(i)>=19968 && str.charCodeAt(i)<=40869

插一句不太严谨的话,代码不用限制太严谨的范围,毕竟你不知道用户(测试)会输哪些奇怪的东西。

收工!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值