Skip to content

用 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);

最后编辑时间:

Version 4.2 (core-1.3.4)