js中计算中文长度方法

/**
 * 该方法用于截取字符串,根据字符和汉语的占位符有对应不同的处理
 * 
 * eg: var titleValue = '1112322';
var showValue = oleSubstring(titleValue, 4);
if (titleValue == showValue) {
titleValue = '';
}
 * @param titleValue 被截取的字符串
 * @param splitLength 需要截取的长度
 * @returns 截取后的字符串
 */
function oleSubstring(titleValue, splitLength) {
var str_length = 0;
var showValue = new String();
var titleValueLength = titleValue.length;
for ( var i = 0; i < titleValueLength; i++) {
var charValue = titleValue.charAt(i);
str_length++;
if (escape(charValue).length > 4) {
// 中文字符的长度经编码之后大于4
str_length++;
}
if (str_length > splitLength) {
break;
}
showValue = showValue.concat(charValue);
}
if (str_length > splitLength) {
showValue = showValue.concat("...");
}
return showValue;

}

由于javascript是unicode编码的,所有的字符对于它来说一个就是一个,但是后台程序不是,通常在后台程序中一个中文是占两个字节的,这就导致了前后端校验长度不一致,这个问题可以通过正则来解决。

[javascript]  view plain  copy
  1. function getRealLen( str ) {  
  2.     return str.replace(/[^\x00-\xff]/g, '__').length; //这个把所有双字节的都给匹配进去了  
  3. }  

附赠另一小则技巧:

有时候为了美观,不影响布局和界面,会以一些文案进行截字,但是中文的宽度和英文的宽度不一样,如果按照英文标准来截中文的,或者按中文标准截英文的,显然会忽长忽短,特别是昵称这类容易既有中文又有英文的东西,同样我们可以用上面的思路

[javascript]  view plain  copy
  1. function beautySub( str, len) {  
  2.        var reg = /[\u4e00-\u9fa5]/g,    //专业匹配中文  
  3.            slice = str.substring(0,len),  
  4.            realen = len - ( ~~( slice.match(reg) && slice.match(reg).length ) );  
  5.            return slice.substring(0, realen ? realen : 1);  
  6. }  

这里我们认为一个中文字符是两个英文字符的宽度,如果你是完美主义者,应该想到j和w,m的宽度是不一样的,w和m以及大写的部分字母和中文的宽度是一致的,这个函数的正则还有相当大的改进空间,同时也可以指定截字的起始位置。


function beautySub( str, len) {  
    var reg = /[\u4e00-\u9fa5]/g,    //专业匹配中文  
        slice = str.substring(0,len),  
        /**其实是一种利用符号进行的类型转换,转换成数字类型
~~true == 1
~~false == 0
~~"" == 0
~~[] == 0

~~undefined ==0
~~!undefined == 1
~~null == 0
~~!null == 1

整数的操作
JavaScript中是没有整型概念的,但利用好位操作符可以轻松处理,同时获得效率上的提升。


|0和~~是很好的一个例子,使用这两者可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快。在处理像素及动画位移等效果的时候会很有用。性能比较见此。


var foo = (12.4 / 4.13) | 0;//结果为3
var bar = ~~(12.4 / 4.13);//结果为3
顺便说句,!!将一个值方便快速转化为布尔值 !!window===true 。
        */
        realen = len - ( ~~( slice.match(reg) && slice.match(reg).length ) );  
        return slice.substring(0, realen ? realen : 1);  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值