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

发布于 2022-09-13 00:12:54 字数 1307 浏览 22 评论 0

我的问题

这行代码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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你的心境我的脸 2022-09-20 00:12:54

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 ++;
}
等待我真够勒 2022-09-20 00:12:54

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

下面是&操作的情况

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文