Nie*_*sol 3 html5 binary-data local-storage
我一直在使用localStorage以字符串格式存储一些二进制数据,虽然这个值是明确设置的(alert
设置后立即设置,或者甚至设置后的一段时间,显示正确的值),但是当页面下次加载时它会丢失.
起初我认为这可能是因为数据包含空字节,所以我重新设计了压缩器,以便它永远不会输出它们.然而,这没有任何区别,因为价值仍然丢失.
我localStorage.testing = 1
在设置二进制数据后立即添加.即使另一个丢失,也会保留此值.
我绝对肯定没有代码delete localStorage.myitem
.
可能导致此问题的原因是什么?
如果它有帮助,这里是我试图存储的数据,以十六进制表示:
0x1103c0a0 0xd6cf0305 0xc0a0d6cf 0x0307c0a0 0xd6cf0309 0xc0a0d6cf
0x030bc0a0 0xd6cf030d 0xc0a0d6cf 0x0311c0a0 0xd6cf0313 0xc0a0d6cf 0x0301
Run Code Online (Sandbox Code Playgroud)
编辑:我刚刚测试过localStorage.testvalue = realvalue.replace(/[\x00-\x1f]/g,'');
并成功保存了它.所以,我想知道规范在哪里说控制字符可能不会用在字符串中.
Rob*_*b W 13
我已经设置了一个测试用例,并在各种浏览器中运行测试.结果如下(提到了字符代码的包含范围).测试从支持的最低浏览器版本开始localStorage
.
0x0000
-0xFFFF
0x0000
-0xFFFF
0x0000
-0xFFFF
0x0000
- 0xD7FF
和0xE000
- 0xFFFE
(0xD800-0xDFFF和0xFFFF在LS后用两个字符转)0x0009
,0x000A
,0x000D
,0x0020
- 0xD7FF
和0xE000
- 0xFFFD
.(其他范围要么被忽略,要么导致"无效参数"错误).0x0000
是一个NULL字节,它截断IE中的所有后续字符.因此,字符范围0x20
- 0xD7FF
和0xE000
- 0xFFFD
加0x09
,0x0A
并且0x0D
是安全的.
我创建了三个测试用例:
localStorage
所有测试函数都可以在JSFiddle中使用,第一个测试用例如下所示:
function run_test(lowerlimit, UPPERLIMIT) {
try {
if (!window.localStorage) {
// I recall that in one of the older Chrome version (4),
// localStorage === null
return 'Localstorage is not supported';
}
if (isNaN(lowerlimit) || isNaN(UPPERLIMIT) || lowerlimit > UPPERLIMIT) {
return 'One of the limits is not a valid number!';
}
var i = lowerlimit - 1;
var character_range = [];
while (++i < UPPERLIMIT) character_range.push(i);
input = String.fromCharCode.apply(String, character_range);
localStorage.setItem('chartest', input);
output = localStorage.getItem('chartest');
if (input === output) {
return true;
}
// Uh oh, not equal!
var result = [];
for (i=0; i<UPPERLIMIT-lowerlimit; i++) {
if (input[i] !== output[i]) {
result.push(i + lowerlimit);
}
}
return result;
}catch(e){return 'Error:' + e;}
}
Run Code Online (Sandbox Code Playgroud)