是否有localStorage中不允许的任何字符?

时间:2012-06-23 15:31:24

标签: html5 local-storage binary-data

我一直在使用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,'');测试并成功保存了它。所以,我想知道规范说控制字符可能不会用在字符串中。

2 个答案:

答案 0 :(得分:11)

我已经设置了test case,并在各种浏览器中运行测试。结果如下(提到了字符代码的包含范围)。测试从支持localStorage的最低浏览器版本开始。

  • Chrome 5 - 20:0x0000 - 0xFFFF
  • Opera 10.50 - 12.00:0x0000 - 0xFFFF
  • Safari 4.0 - 5.1.7:0x0000 - 0xFFFF
  • Firefox 3.5 - 16 alpha 0x0000 - 0xD7FF0xE000 - 0xFFFE(0xD800-0xDFFF和0xFFFF分为两个字符)在LS之后)
  • IE8,IE9,IE10 PP6 0x00090x000A0x000D0x0020 - 0xD7FF和{{1 } - 0xE000。 (忽略其他范围或导致“无效参数”错误) 0xFFFD是一个NULL字节,它会截断IE中的所有后续字符。

因此,字符范围0x0000 - 0x200xD7FF - 0xE0000xFFFD0x09和{{1是安全的。


我创建了三个测试用例:

  1. 最快的测试用例,它创建一个包含所有字符的字符串,并在设置0x0A
  2. 后测试该值
  3. 使用SPACE字符(0x20)作为分隔符的方法,以正确处理创建长度为2的字符的浏览器。
  4. 最糟糕的方法,因为IE会为无效字符串抛出错误。每个角色都经过单独测试,非常昂贵。
  5. JSFiddle中提供了所有测试功能,第一个测试用例如下所示:

    0x0D

答案 1 :(得分:0)

经过进一步测试后,看来当localStorage说它存储字符串时,它的真正含义是存储匹配的字符串:

/^[\x00\x09\x0A\x0D\x20-\xff]*$/

除了HT,CR,LF和NUL之外,在空格之前没有任何内容。

那说,仍然不知道为什么。