var s = '吉林?';
s.length; //4
用js输出s.length的是4,但是变量s的字符串的个数是3,如何通过代码准确得到变量 s 的字符串个数(3)?
var s = '吉林?';
s.length; //4
用js输出s.length的是4,但是变量s的字符串的个数是3,如何通过代码准确得到变量 s 的字符串个数(3)?
忽略了中间有空格的情况,仅统计汉字:
方法一
var s = '吉 林 ?';
console.log(s.match(/[\u4e00-\u9fa5]/g).length + s.match(/[\u9fa6-\uffff]/g).length / 2);
输出:3
方法二
var s = '吉 林 ?';
console.log(s.replace(/\s+/g, "").match(/\s|\S/gu).length);
输出:3
不忽略空格的情况:
var s = '吉 林 ?';
console.log(s.match(/\s|\S/gu).length);
输出:5
引子
虽然我没有正确答案,但是可以提供一点线索.
在犀牛书
上看到.淘宝前端翻译的第6版39页
理论基础
js里面的字符串是采用utf-16
编码的unicode
字符集.
可以这样理解,一个字符
等价于一个16位值
的unicode字符
所有针对字符串的操作,实际上是对unicode进行操作.
但是,最常用的unicode
根本无法容纳地球上所有文字,所以有些字符必须用两个unicode
表示..因此,这种字符的长度就是2
.
实验吉林?
转换成unicode字符的结果是\u5409\u6797\ud842\udfb7
看吧,3个汉字实际上是4个unicode了....长度就肯定是4呀
解决
开始我还以为是两个吉林的吉字呢.....
结果仔细看,第3个字是个特殊字符...难怪常用的unicode不包含它呢.所以用了2个nunicode来表示...
这个时候就不能使用js自带的方法来处理字符串啦,因为这些方法实际上处理unicode的方法,而不是处理汉字的方法..
就要找一个处理汉字的方法..就像一楼说的那样...
处理4字节的unicode.相当于是utf-32编码的字符集...就完全能够代表所有的汉字及特殊字符啦
function getStrLen (str) {
let s = 0 ;
if (str !== undefined && str !== null) {
s = str.match(/\s|\S/gu).length
}
return s
}
escape('吉林?').toLocaleLowerCase().replace(/%u/gi,'\\u');
// "\u5409\u6797\ud842\udfb7"
特殊字符,用正则吧
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
5 回答1.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
s.match(/[\s\S]/gu).length
主要是正则表达式
u
标志符可以匹配4字节 Unicode 编码。空字符串要处理一下。。。因为 match 返回
null
。正则表达式
u
是ES6的特性,同样的ES6的字符串迭代器也能正确处理 Unicode 编码:[...s].length
等等写法。我好奇地跑去 babel 测试了一下,发现了这群大触丧病的 hack: