JS計算字串所佔位元組數

2021-07-06 06:32:27 字數 1811 閱讀 8417

廢話不說,直接正題吧。

最近專案有個需求要用js計算一串字串寫入到localstorage裡所佔的記憶體,眾所周知的,js是使用unicode編碼的。而unicode的實現有n種,其中用的最多的就是utf-8和utf-16。因此本文只對這兩種編碼進行討論。

下面這個定義摘自維基百科(做了部分刪減。

utf-8(8-bit unicode transformation format)是一種針對unicode的可變長度字元編碼,可以表示unicode標準中的任何字元,且其編碼中的第乙個位元組仍與ascii相容,使用一至四個位元組為每個字元編碼

其編碼規則如下:

字元**在000000 – 00007f之間的,用乙個位元組編碼;

000080 – 0007ff之間的字元用兩個位元組;

000800 – 00d7ff 和 00e000 – 00ffff之間的用三個位元組,注: unicode在範圍 d800-dfff 中不存在任何字元;

010000 – 10ffff之間的用4個位元組。

而utf-16 則是定長的字元編碼,大部分字元使用兩個位元組編碼,字元**超出 65535 的使用四個位元組,如下:

000000 – 00ffff 兩個位元組;

010000 – 10ffff 四個位元組。

一開始認為既然頁面用的是utf-8編碼,那麼存入localstorage的字串,應該也是用utf-8編碼的。但後來測試發現,明明計算出的 size是不到5mb,存入localstorage卻拋異常了。想了想,頁面的編碼是可以改的。如果localstorage按照頁面的編碼存字串, 不就亂套了?瀏覽器應該都是使用utf-16編碼的。用utf-16編碼計算出5mb的字串,果然順利寫進去了。超過則失敗了。

好了,附上**實現。計算規則就是上面寫的,為了計算速度,把兩個for迴圈分開寫了。

/**

* 計算字串所佔的記憶體位元組數,預設使用utf-8的編碼方式計算,也可制定為utf-16

* utf-8 是一種可變長度的 unicode 編碼格式,使用一至四個位元組為每個字元編碼

* * 000000 - 00007f(128個**) 0zzzzzzz(00-7f) 乙個位元組

* 000080 - 0007ff(1920個**) 110yyyyy(c0-df) 10zzzzzz(80-bf) 兩個位元組

* 000800 - 00d7ff

00e000 - 00ffff(61440個**) 1110***x(e0-ef) 10yyyyyy 10zzzzzz 三個位元組

* 010000 - 10ffff(1048576個**) 11110www(f0-f7) 10****** 10yyyyyy 10zzzzzz 四個位元組

* * 注: unicode在範圍 d800-dfff 中不存在任何字元

* *

* utf-16 大部分使用兩個位元組編碼,編碼超出 65535 的使用四個位元組

* 000000 - 00ffff 兩個位元組

* 010000 - 10ffff 四個位元組

* *

* @param str

* @param charset utf-8, utf-16

* @return

*/var sizeof = function(str, charset)else

}}elseelse if(charcode <= 0x07ff)else if(charcode <= 0xffff)else}}

return total;

}

JS計算字串所佔位元組數

最近專案有個需求要用js計算一串字串寫入到localstorage裡所佔的記憶體,眾所周知的,js是使用unicode編碼的。而unicode的實現有n種,其中用的最多的就是utf 8和utf 16。因此本文只對這兩種編碼進行討論。下面這個定義摘自維基百科 做了部分刪減。utf 8 8 bit un...

字元所佔位元組數

不同的字元所佔的位元組是不同的。ascii碼 乙個英文本母 不分大小寫 佔乙個位元組的空間,乙個中文漢字佔兩個位元組的空間。乙個二進位制數字序列,在計算機中作為乙個數字單元,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。如乙個ascii碼就是乙個位元組。utf 8編碼 乙個英文本元等...

計算字串的位元組數

str.charcodeat index 返回字串中字元的unicode編碼 unicode大於255的是兩個位元組 小於等於255的是乙個位元組 unicode 是目前用來解決 ascii 碼 256 個字元限制問題的一種比較流行的解決方案。大家知道,ascii 字符集只有256個字元,用 0 2...