JS計算字元串所佔位元組數

JS計算字元串所佔位元組數

廢話不說,直接正題吧。

最近項目有個需求要用js計算一串字元串寫入到localStorage里所佔的內存,眾所周知的,js是使用Unicode編碼的。而Unicode的實現有N種,其中用的最多的就是UTF-8和UTF-16。因此本文只對這兩種編碼進行討論。

下面這個定義摘自維基百科(http://zh.wikipedia.org/zh-cn/UTF-8),做了部分刪減。

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,可以表示Unicode標準中的任何字元,且其編碼中的第一個位元組仍與ASCII相容,使用一至四個位元組為每個字元編碼。

其編碼規則如下:

  1. 字元代碼在000000 – 00007F之間的,用一個位元組編碼;
  2. 000080 – 0007FF之間的字元用兩個位元組;
  3. 000800 – 00D7FF 和00E000 – 00FFFF之間的用三個位元組,注: Unicode在範圍 D800-DFFF 中不存在任何字元;
  4. 010000 – 10FFFF之間的用4個位元組。

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

  1. 000000 – 00FFFF 兩個位元組;
  2. 010000 – 10FFFF 四個位元組。

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

好了,附上代碼實現。計算規則就是上面寫的,為了計算速度,把兩個for循環分開寫了。

雙擊選中源代碼
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 /*** 計算字元串所佔的內存位元組數,默認使用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個代碼) 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 三個位元組* 010000 - 10FFFF(1048576個代碼) 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz 四個位元組* * 注: Unicode在範圍 D800-DFFF 中不存在任何字元* {@link http://zh.wikipedia.org/wiki/UTF-8}* * UTF-16 大部分使用兩個位元組編碼,編碼超出 65535 的使用四個位元組* 000000 - 00FFFF 兩個位元組* 010000 - 10FFFF 四個位元組* * {@link http://zh.wikipedia.org/wiki/UTF-16}* @param {String} str * @param {String} charset utf-8, utf-16* @return {Number}*/var sizeof = function(str, charset){var total = 0,charCode,i,len;charset = charset ? charset.toLowerCase() : "";if(charset === "utf-16" || charset === "utf16"){for(i = 0, len = str.length; i < len; i++){charCode = str.charCodeAt(i);if(charCode <= 0xffff){total += 2;}else{total += 4;}}}else{for(i = 0, len = str.length; i < len; i++){charCode = str.charCodeAt(i);if(charCode <= 0x007f) {total += 1;}else if(charCode <= 0x07ff){total += 2;}else if(charCode <= 0xffff){total += 3;}else{total += 4;}}}return total;}
內存佔用,字元串,位元組數,計算

推薦閱讀:

精彩QQ字元貼圖之?節日
玫瑰十字元號詳解
一個人,一首歌,一支筆,一串字元,幾縷情絲,一段年華。
簡譜音樂符號大全 音樂字元大全

TAG:計算 | 字元串 | 佔位 | 字元 |