在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML5  HTML/ 用JS怎樣才能正確的得到字符串的長度?

用JS怎樣才能正確的得到字符串的長度?

var s = '吉林?';
s.length; //4

用js輸出s.length的是4,但是變量s的字符串的個數(shù)是3,如何通過代碼準(zhǔn)確得到變量 s 的字符串個數(shù)(3)?

回答
編輯回答
祉小皓

s.match(/[\s\S]/gu).length
主要是正則表達(dá)式u標(biāo)志符可以匹配4字節(jié) Unicode 編碼。
空字符串要處理一下。。。因為 match 返回 null。


正則表達(dá)式u是ES6的特性,同樣的ES6的字符串迭代器也能正確處理 Unicode 編碼:[...s].length等等寫法。

我好奇地跑去 babel 測試了一下,發(fā)現(xiàn)了這群大觸喪病的 hack:

s.match(/[\s\S]/gu)

s.match(/(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g)
2017年5月5日 22:19
編輯回答
尋仙

引子
雖然我沒有正確答案,但是可以提供一點線索.
犀牛書上看到.淘寶前端翻譯的第6版39頁

理論基礎(chǔ)
js里面的字符串是采用utf-16編碼的unicode字符集.
可以這樣理解,一個字符等價于一個16位值unicode字符
所有針對字符串的操作,實際上是對unicode進(jìn)行操作.

但是,最常用的unicode根本無法容納地球上所有文字,所以有些字符必須用兩個unicode表示..因此,這種字符的長度就是2.

實驗
吉林?
轉(zhuǎn)換成unicode字符的結(jié)果是
\u5409\u6797\ud842\udfb7

看吧,3個漢字實際上是4個unicode了....長度就肯定是4呀

解決
開始我還以為是兩個吉林的吉字呢.....
結(jié)果仔細(xì)看,第3個字是個特殊字符...難怪常用的unicode不包含它呢.所以用了2個nunicode來表示...

這個時候就不能使用js自帶的方法來處理字符串啦,因為這些方法實際上處理unicode的方法,而不是處理漢字的方法..
就要找一個處理漢字的方法..就像一樓說的那樣...

處理4字節(jié)的unicode.相當(dāng)于是utf-32編碼的字符集...就完全能夠代表所有的漢字及特殊字符啦

2017年3月6日 05:41
編輯回答
孤星

忽略了中間有空格的情況,僅統(tǒng)計漢字:
方法一

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
2017年12月6日 21:36
編輯回答
雅痞

最后一個字是特殊字符吧

2017年3月25日 14:44
編輯回答
舊時光

最后一個字符是特殊字符,長度是2.
你可以用正則將特殊字符匹配出來,然后算其他字符的長度最后再加上特殊字符的個數(shù)。

2017年8月17日 20:50
編輯回答
囍槑

最后一個字符是特殊字符,長度是2

2017年8月18日 00:41
編輯回答
伐木累
escape('吉林?').toLocaleLowerCase().replace(/%u/gi,'\\u');
// "\u5409\u6797\ud842\udfb7"

特殊字符,用正則吧

2018年9月23日 12:34
編輯回答
青黛色
function getStrLen (str) {
  let s = 0 ;
  if (str !== undefined && str !== null) {
    s = str.match(/\s|\S/gu).length
  }
  return s
}
2017年7月1日 07:53