最近專案有個需求要用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迴圈分開寫了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
* 計算字串所佔的記憶體位元組數,預設使用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
}
}
else
else
if
(charcode <= 0x07ff)
else
if
(charcode <= 0xffff)
else
}
}
return
total;
}
JS計算字串所佔位元組數
廢話不說,直接正題吧。最近專案有個需求要用js計算一串字串寫入到localstorage裡所佔的記憶體,眾所周知的,js是使用unicode編碼的。而unicode的實現有n種,其中用的最多的就是utf 8和utf 16。因此本文只對這兩種編碼進行討論。下面這個定義摘自維基百科 做了部分刪減。utf...
字元所佔位元組數
不同的字元所佔的位元組是不同的。ascii碼 乙個英文本母 不分大小寫 佔乙個位元組的空間,乙個中文漢字佔兩個位元組的空間。乙個二進位制數字序列,在計算機中作為乙個數字單元,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。如乙個ascii碼就是乙個位元組。utf 8編碼 乙個英文本元等...
計算字串的位元組數
str.charcodeat index 返回字串中字元的unicode編碼 unicode大於255的是兩個位元組 小於等於255的是乙個位元組 unicode 是目前用來解決 ascii 碼 256 個字元限制問題的一種比較流行的解決方案。大家知道,ascii 字符集只有256個字元,用 0 2...