用 javascript 统计字数,计数问题
用 javascript 计算 length 时不管是中文还是英文,都记为 1, 但是有时候我们希望中文计算成 2.
计数方式 1:通过判断 escape 后的长度来计算
js
var str = "string";
var str_length = 0;
for (var i = 0; i < str.length; i++) {
str_length++;
if (escape(str.charAt(i)).length > 4) {
// 中文字符的长度经编码之后大于 4
str_length++;
}
}
计数方式 2:通过正则和字节数判断
遇到双字节的就替换为 aa:
js
function getLength(str) {
return str.replace(/[^\x00-\xff]/g, "aa").length;
}
关于计数的其他问题
问题描述
JS 不能正确统计 Unicode 字符数量的问题
js
var s = "吉林𠮷";
s.length; //4
用 js 输出 s.length
的是 4,但是变量 s 的字符串的个数是 3
解决方案
js
s.match(/[\s\S]/gu).length;
主要是正则表达式 u 标志符可以匹配 4 字节 Unicode 编码。
空字符串要处理一下,因为 match 返回 null。
正则表达式 u 是 ES6 的特性,同样的 ES6 的字符串迭代器也能正确处理 Unicode 编码:[...s].length
等等写法。
js
// ES6
s.match(/[\s\S]/gu);
// ES5 hack
s.match(
/(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](\uDC00-\uDFFF)|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g
);
拓展
中间有空格,只统计汉字
js
var s = "吉 林 𠮷";
console.log(s.replace(/\s+/g, "").match(/\s|\S/gu).length);