在使用计算带中文的字符串长度函数时,遇到一段代码没太理解

小刘
  • 526

我的问题

这行代码str.charCodeAt(i) & 0xff00怎么理解,具体作用是什么?

全部代码

let str = "刘建的世界123"

// 计算中文字符串的长度(方法1)
var helper = {};
helper.getRealLength = function(str) {
    ///<summary>获得字符串实际长度,中文2,英文1</summary>
    ///<param name="str">要获得长度的字符串</param>
    var realLength = 0, len = str.length, charCode = -1;
    for (var i = 0; i < len; i++) {
        charCode = str.charCodeAt(i);
        if (charCode >= 0 && charCode <= 128) 
              realLength += 1;
        else
              realLength += 2;
    }
    return realLength;
};

console.log('方法(1)length== ', helper.getRealLength(str))

// 计算中文字符串的长度(方法2)
var l = str.length;
var blen = 0;
for(i=0; i<l; i++) {
    if ((str.charCodeAt(i) & 0xff00) != 0) {
        blen ++;
    }
    blen ++;
}

console.log('方法(2)length== ', blen)

// 计算中文字符串的长度(方法3)

let regCN = /[\u0391-\uFFE5]/g

let len = 0
for(var i in str) {
    // console.log(i);
    console.log(regCN.test(str[i]), regCN.lastIndex);
    if(regCN.test(str[i])) {
        console.log(str[i] + "=2");
        len += 2
    } else {
        console.log(str[i] + "=1");
        len += 1
    }
}
console.log(len)
str = str.replace(/[\u0391-\uFFE5]/g,"aa");
console.log('方法(3)length== ', str.length)
回复
阅读 299
2 个回答

str.charCodeAt(i)
判断是否是中文字符:当 str.charCodeAt(i) > 255 时,表示是中文字符

256       => 0000 0001 0000 0000
0xff00    => 1111 1111 0000 0000
&(按位与)=> 0000 0001 0000 0000
表示如果是中文字符,按位与的结果就是中文字符本身

否则如果是任何一个小于 256 的字符

255       => 0000 0000 1000 0000
0xff00    => 1111 1111 0000 0000
&(按位与)=> 0000 0000 0000 0000
可见结果都是 0

可以直接使用如下代码 有一样的效果
上述使用了一个按位与的操作符的奇淫巧计

if (str.charCodeAt(i) > 255) {
    blen ++;
}

str.charCodeAt(i) & 0xff00表示取两字节中的高位字节,中文高位字节不为0,所以blen执行了两次自加。

下面是&操作的情况

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏