Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么对于不太长的字符串,每个项都会出现配额字节错误?_Javascript_Json_Google Chrome_Google Chrome Extension_Google Chrome Storage - Fatal编程技术网

Javascript 为什么对于不太长的字符串,每个项都会出现配额字节错误?

Javascript 为什么对于不太长的字符串,每个项都会出现配额字节错误?,javascript,json,google-chrome,google-chrome-extension,google-chrome-storage,Javascript,Json,Google Chrome,Google Chrome Extension,Google Chrome Storage,我的分机中有一个表示播放列表的对象,我需要将其保存到chrome.storage.sync 我知道每个项目大约有4096个配额字节,这意味着key.length+JSON.stringify(val).length必须小于4096。但是我的对象是3956(val stringify length+ket length),我仍然无法将其写入存储器。我做错了什么 我的对象JSON字符串化结果: {"playlist":{"state":{"tracks":[{"artist":"In Flames"

我的分机中有一个表示播放列表的对象,我需要将其保存到chrome.storage.sync

我知道每个项目大约有4096个配额字节,这意味着
key.length+JSON.stringify(val).length
必须小于4096。但是我的对象是3956(val stringify length+ket length),我仍然无法将其写入存储器。我做错了什么

我的对象JSON字符串化结果:

{"playlist":{"state":{"tracks":[{"artist":"In Flames","title":"Delight And Angers (Instrumental)"},{"artist":"Marilyn Manson","title":"Coma Black"},{"artist":"Red Hot Chili Peppers","title":"Can't Stop"},{"artist":"Jack Johnson","title":"Better Together (Hawaiian Version)"},{"artist":"Joel Nielsen","title":"Surface Tension 2"},{"artist":"Katatonia","title":"Deliberation"},{"artist":"Rev Theory","title":"Hell Yeah"},{"artist":"Die drei Friseure ","title":"Parikmaher"},{"artist":"In Flames","title":"Drenched in Fear"},{"artist":"In Flames","title":"A New Dawn"},{"artist":"Before The Dawn","title":"The First Snow/Winter Within"},{"artist":"Corey Taylor & James Root","title":"Zzyzx Road"},{"artist":"In Flames","title":"Ropes"},{"artist":"In Flames","title":"Come Clarity"},{"artist":"Jack Johnson","title":"Better Together"},{"artist":"In Flames","title":"Crawl Through Knives"},{"artist":"Ленинград","title":"День Рождения.а я вот день рожденье не буду справлять!"},{"artist":"Ellen McLain","title":"Still Alive"},{"artist":"Richard Cheese","title":"People Equals Shit "},{"artist":"Papa Roach","title":"Last Resort"},{"artist":"Killswitch Engage","title":"The End of Heartache"},{"artist":"Sonic Syndicate","title":"Denied"},{"artist":"Trivium","title":"Pull Harder On The Strings Of Your Martyr"},{"artist":"Bon Jovi","title":"Last Man Standing"},{"artist":"Jelonek","title":"Beast"},{"artist":"Gorillaz","title":"Feel Good Inc"},{"artist":"Five Finger Death Punch","title":"Falling In Hate"},{"artist":"Metallica","title":"The Memory Remains (Live)"},{"artist":"Richard Z. Kruspe","title":"Wake up"},{"artist":"Nylithia","title":"Infector (Intro)"},{"artist":"Nylithia","title":"Super Mario B Castle Theme"},{"artist":"Scorpions/Скорпионс","title":"Wind Of Change/Ветер Перемен  (Версия на русском языке)"},{"artist":"Michael Andrews","title":"Mad World"},{"artist":"John 5","title":"2 Die 4"},{"artist":"Escape the Fate","title":"This War Is Ours (The Guillotine Part II)"},{"artist":"John 5","title":"Damaged"},{"artist":"Marty Friedman","title":"Dragon Mistress"},{"artist":"Pelican","title":"The Creeper"},{"artist":"JELONEK","title":"BaRock"},{"artist":"Blotted Science","title":"Laser Lobotomy"},{"artist":"The String Quartet Tribute  to NIRVANA","title":"Come As You Are "},{"artist":"String Tribute","title":"Tears Don't Fall (BFMV)"},{"artist":"Papa Roach","title":"Change or Die"},{"artist":"Trivium","title":"Dying in your arms"},{"artist":"Disturbed","title":"Decadance"},{"artist":"Bullet For My Valentine","title":"Turn To Despair"},{"artist":"Metallica","title":"Orion [Instrumental]"},{"artist":"Divination","title":"The Heretic Anthem"},{"artist":"Bullet for my Valentine","title":"Say Goodnight (Acoustic Version)"},{"artist":"Кувалда","title":"Бетономешалка"},{"artist":"Slipknot","title":"Confessions"},{"artist":"Bullet For My Valentine","title":"7 Days (Bonus Track)"},{"artist":"Bullet for My Valentine","title":"Forewer and Always (Acoustic Version)"},{"artist":"Bullet For My Valentine","title":"Hearts Burst Into Fire (Acoustic Version)"},{"artist":"In Flames","title":"Everlost (Part II)"},{"artist":"In Flames","title":"Acoustic Medley"},{"artist":"In Flames","title":"Cloud Connected"},{"artist":"In Flames","title":"Crawl Through Knives"},{"artist":"In Flames","title":"Free Fall"},{"artist":"Metallica","title":"Die, Die My Darling"},{"artist":"Slipknot","title":"Psychosocial (Album Version)"},{"artist":"Korn","title":"Jingle Bells"},{"artist":"Stone Sour","title":"Through Glass"},{"artist":"Slipknot","title":"Snuff"},{"artist":"Звонок в компанию Microsoft","title":"Как крякнуть Висту?"},{"artist":"Furious Ball","title":"Fog"},{"artist":"The Beatles","title":"Yellow Submarine"},{"artist":"Lumen","title":"Космонавт"},{"artist":"Lumen","title":"Государство"},{"artist":"Bullet For My Valentine","title":"Tears Don't Fall (Acoustic) (Bonus Track)"},{"artist":"Karunesh","title":"The Wanderer "}],"currentTrack":0}}}
以下代码计算要存储在存储器中的对象大小:

for(var i in obj) {
    console.log(i, JSON.stringify(obj[i]).length + i.length)
}
它回来了

> playlist 3956 
我不明白,也许是因为我的物体中有UTF-8非拉丁符号,才有这种魔力?可能是本机端的chrome执行了此字符的转义(\uxxx),长度超过4096?如果是这样的话,我怎样才能让JSON.stringify()也进行转义呢?

指定以字节为单位的最大大小。在Chrome中,JavaScript字符串编码为UTF-8。UTF-8“字符”具有可变字节长度,可以是1或2

您的字符串包含“ББСаааа”。字符串长度为13,但字节大小为26


要检测字符的大小,可以使用
string.charCodeAt(index)
获取指定索引处字符串的字符代码。如果这个数字小于256(这是个好问题,但可能不是最好的标题。你能重新格式化它吗?你对标题有什么建议吗?“计算
chrome.storage.sync
item length”
/**
 * Count bytes in a UTF-8 string's representation.
 *
 * @param {string}
 * @return {number}
 */
function byteLength(str) {
    str = String(str); // force string type
    return (new TextEncoder('utf-8').encode(str)).length;
}