js中的字串長度
阿新 • • 發佈:2019-02-13
眾所周知String物件的length屬效能夠返回字串的長度,不管字元是單位元組還是雙位元組,都作為一個長度單位來計算。因此要準確的獲取字元長度,必須通過手工來寫。
下面介紹兩種方式:
1、迴圈遍歷字串,根據字元的編碼,來判斷當前字元是雙位元組還是單位元組,然後遞加字串的位元組數。
<span style="font-size:14px;">String.prototype.lengthSingle = function(str){ var b = 0; for(var i=0,l=str.length;i<l;i++){ if(this.chartCodeAt(i)>255){ b +=2; }else{ b++; } } return b; }</span>
或者根據escape來判斷是否為單位元組還是雙位元組。escape的作用是對 String 物件編碼以便它們能在所有計算機上可讀。
escape 方法返回Unicode格式的字串值。所有空格、標點、重音符號以及 其他非 ASCII 字元都用 %xx 編碼代替,其中 xx 等於表示該字元的十六進位制數。例如,空格返回的是 "%20 " 。 字元值大於 255 的以 %uxxxx 格式儲存。 因此可以通過使用escape方法後返回的值的長度來確定是單位元組還是雙位元組。
亦可以使用正則表示式來判斷為單位元組還是雙位元組。<pre name="code" class="javascript"><span style="font-size:14px;">String.prototype.lengthSingle = function(str){ var b = 0; for(var i=0,l=str.length;i<l;i++){ var c = this.charAt(i); if(escape(c).length>4){ b+=2; }else if(c!="\r"){ b++; } } return b; }</span>
第二種方式,則是將字串中的所有雙位元組字元,使用**代替,然後再統計長度。由於會使用到兩次遍歷,因此效率沒有第一種高。故不描述了。<pre name="code" class="javascript"><span style="font-size:14px;">String.prototype.lengthSingle = function(str){ var b = 0; for(var i=0,l=str.length;i<l;i++){ var c = this.charAt(i); if(/^[\u0000-\u00ff]$/.test(c)){ b++; }else{ b+=2; } } return b; }</span>