我一直在使用localStorage以字符串格式存储一些二进制数据,虽然该值已经设置好(设置后立即alert
,或者甚至设置后的某个时间,显示正确的值)当页面下次加载时丢失。
起初我认为这可能是因为数据包含空字节,所以我重新设计了压缩器,以便它永远不会输出它们。但是,由于价值仍然存在,这没有任何区别。
我在设置二进制数据后立即添加了localStorage.testing = 1
。即使另一个丢失,也会保留此值。
我绝对相信delete localStorage.myitem
没有代码。
可能导致此问题的原因是什么?
如果它有帮助,这里是我试图存储的数据,用十六进制:
0x1103c0a0 0xd6cf0305 0xc0a0d6cf 0x0307c0a0 0xd6cf0309 0xc0a0d6cf
0x030bc0a0 0xd6cf030d 0xc0a0d6cf 0x0311c0a0 0xd6cf0313 0xc0a0d6cf 0x0301
localStorage.testvalue = realvalue.replace(/[\x00-\x1f]/g,'');
测试并成功保存了它。所以,我想知道规范说控制字符可能不会用在字符串中。
答案 0 :(得分:11)
我已经设置了test case,并在各种浏览器中运行测试。结果如下(提到了字符代码的包含范围)。测试从支持localStorage
的最低浏览器版本开始。
0x0000
- 0xFFFF
0x0000
- 0xFFFF
0x0000
- 0xFFFF
0x0000
- 0xD7FF
和0xE000
- 0xFFFE
(0xD800-0xDFFF和0xFFFF分为两个字符)在LS之后)0x0009
,0x000A
,0x000D
,0x0020
- 0xD7FF
和{{1 } - 0xE000
。 (忽略其他范围或导致“无效参数”错误)
0xFFFD
是一个NULL字节,它会截断IE中的所有后续字符。 因此,字符范围0x0000
- 0x20
和0xD7FF
- 0xE000
加0xFFFD
,0x09
和{{1是安全的。
我创建了三个测试用例:
0x0A
JSFiddle中提供了所有测试功能,第一个测试用例如下所示:
0x0D
答案 1 :(得分:0)
经过进一步测试后,看来当localStorage说它存储字符串时,它的真正含义是存储匹配的字符串:
/^[\x00\x09\x0A\x0D\x20-\xff]*$/
除了HT,CR,LF和NUL之外,在空格之前没有任何内容。
那说,仍然不知道为什么。