Javascript 計算字符串在localStorage中所占字節(jié)數(shù)
最近項目有個需求要用js計算一串字符串寫入到localStorage里所占的內(nèi)存,眾所周知的,js是使用Unicode編碼的。而Unicode的實(shí)現(xiàn)有N種,其中用的最多的就是UTF-8和UTF-16。因此本文只對這兩種編碼進(jìn)行討論。
下面這個定義摘自維基百科(http://zh.wikipedia.org/zh-cn/UTF-8),做了部分刪減。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,可以表示Unicode標(biāo)準(zhǔn)中的任何字符,且其編碼中的第一個字節(jié)仍與ASCII相容,使用一至四個字節(jié)為每個字符編碼
其編碼規(guī)則如下:
字符代碼在000000 – 00007F之間的,用一個字節(jié)編碼;
000080 – 0007FF之間的字符用兩個字節(jié);
000800 – 00D7FF 和 00E000 – 00FFFF之間的用三個字節(jié),注: Unicode在范圍 D800-DFFF 中不存在任何字符;
010000 – 10FFFF之間的用4個字節(jié)。
而UTF-16 則是定長的字符編碼,大部分字符使用兩個字節(jié)編碼,字符代碼超出 65535 的使用四個字節(jié),如下:
000000 – 00FFFF 兩個字節(jié);
010000 – 10FFFF 四個字節(jié)。
一開始認(rèn)為既然頁面用的是UTF-8編碼,那么存入localStorage的字符串,應(yīng)該也是用UTF-8編碼的。但后來測試發(fā)現(xiàn),明明計算出的size是不到5MB,存入localStorage卻拋異常了。想了想,頁面的編碼是可以改的。如果localStorage按照頁面的編碼存字符串,不就亂套了?瀏覽器應(yīng)該都是使用UTF-16編碼的。用UTF-16編碼計算出5MB的字符串,果然順利寫進(jìn)去了。超過則失敗了。
好了,附上代碼實(shí)現(xiàn)。計算規(guī)則就是上面寫的,為了計算速度,把兩個for循環(huán)分開寫了。
/** * 計算字符串所占的內(nèi)存字節(jié)數(shù),默認(rèn)使用UTF-8的編碼方式計算,也可制定為UTF-16 * UTF-8 是一種可變長度的 Unicode 編碼格式,使用一至四個字節(jié)為每個字符編碼 * * 000000 - 00007F(128個代碼) 0zzzzzzz(00-7F) 一個字節(jié) * 000080 - 0007FF(1920個代碼) 110yyyyy(C0-DF) 10zzzzzz(80-BF) 兩個字節(jié) * 000800 - 00D7FF 00E000 - 00FFFF(61440個代碼) 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 三個字節(jié) * 010000 - 10FFFF(1048576個代碼) 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz 四個字節(jié) * * 注: Unicode在范圍 D800-DFFF 中不存在任何字符 * {@link http://zh.wikipedia.org/wiki/UTF-8} * * UTF-16 大部分使用兩個字節(jié)編碼,編碼超出 65535 的使用四個字節(jié) * 000000 - 00FFFF 兩個字節(jié) * 010000 - 10FFFF 四個字節(jié) * * {@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; }
- 使用jquery讀取html5 localstorage的值的方法
- JavaScript使用localStorage存儲數(shù)據(jù)
- JS 中LocalStorage和SessionStorage的使用
- JS中LocalStorage與SessionStorage五種循序漸進(jìn)的使用方法
- JS中利用localStorage防止頁面動態(tài)添加數(shù)據(jù)刷新后數(shù)據(jù)丟失
- JS實(shí)現(xiàn)本地存儲信息的方法(基于localStorage與userData)
- localStorage的黑科技-js和css緩存機(jī)制
- JavaScript中l(wèi)ocalStorage對象存儲方式實(shí)例分析
- 移動端使用localStorage緩存Js和css文的方法(web開發(fā))
- 詳解JavaScript中l(wèi)ocalStorage使用要點(diǎn)
- JS localStorage實(shí)現(xiàn)本地緩存的方法
- JS+HTML5本地存儲Localstorage實(shí)現(xiàn)注冊登錄及驗證功能示例
相關(guān)文章
詳解Bootstrap glyphicons字體圖標(biāo)
本章將講解Bootstrap glyphicons字體圖標(biāo),并通過一些實(shí)例了解它的使用,字體圖標(biāo)是在 Web 項目中使用的圖標(biāo)字體。字體圖標(biāo)在下載的Bootstrap的fonts文件夾中2016-01-01用JavaScrpt實(shí)現(xiàn)文件夾簡單輕松加密的實(shí)現(xiàn)方法圖文
電腦里經(jīng)常會存儲著重要文件,這些文件需要進(jìn)行加密,有許多方法來實(shí)現(xiàn)。但如果想對一個文件夾里的所有文件都進(jìn)行加密,數(shù)量少還可以,要是數(shù)量多豈不是得把人累死?2008-09-09JavaScript實(shí)現(xiàn)的商品搶購倒計時功能示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的商品搶購倒計時功能,可實(shí)現(xiàn)分秒級別的實(shí)時顯示倒計時效果,涉及js日期時間計算與頁面元素動態(tài)操作相關(guān)技巧,需要的朋友可以參考下2017-04-04用nodejs訪問ActiveX對象,以操作Access數(shù)據(jù)庫為例。
有人提問“如果用nodejs訪問sql server?” 找了找資料,發(fā)現(xiàn)有兩類解決方法,使用第三方nodejs插件2011-12-12javascript中關(guān)于類型判斷的一些疑惑小結(jié)
這篇文章主要給大家介紹了關(guān)于javascript中關(guān)于類型判斷的一些疑惑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10window.location的重寫及判斷l(xiāng)ocation是否被重寫
這篇文章主要介紹了window.location的重寫及判斷l(xiāng)ocation是否被重寫,需要的朋友可以參考下2014-09-09