Html 是否存在localStorage中不允许的字符?

Html 是否存在localStorage中不允许的字符?,html,local-storage,binary-data,Html,Local Storage,Binary Data,我一直在使用localStorage以字符串格式存储一些二进制数据,尽管该值已明确设置(alert在设置后立即调用它,甚至在设置后一段时间,显示正确的值),但在下次加载页面时,该值会丢失 起初我认为这可能是因为数据包含空字节,所以我重新设计了压缩器,使其永远不会输出它们。但是,这没有什么区别,因为值仍然丢失 我在设置二进制数据后立即添加了localStorage.testing=1。即使另一个值丢失,也会保留该值 我绝对肯定没有代码可以删除localStorage.myitem 是什么导致了这个

我一直在使用localStorage以字符串格式存储一些二进制数据,尽管该值已明确设置(
alert
在设置后立即调用它,甚至在设置后一段时间,显示正确的值),但在下次加载页面时,该值会丢失

起初我认为这可能是因为数据包含空字节,所以我重新设计了压缩器,使其永远不会输出它们。但是,这没有什么区别,因为值仍然丢失

我在设置二进制数据后立即添加了
localStorage.testing=1
。即使另一个值丢失,也会保留该值

我绝对肯定没有代码可以
删除localStorage.myitem

是什么导致了这个问题

如果有帮助,以下是我试图存储的数据,十六进制:

0x1103c0a0   0xd6cf0305   0xc0a0d6cf   0x0307c0a0   0xd6cf0309   0xc0a0d6cf
0x030bc0a0   0xd6cf030d   0xc0a0d6cf   0x0311c0a0   0xd6cf0313   0xc0a0d6cf   0x0301


编辑:我刚刚用
localStorage.testvalue=realvalue.replace(/[\x00-\x1f]/g',)进行了测试并成功保存了它。所以,我想知道规范在哪里规定控制字符不能在字符串中使用。

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

/^[\x00\x09\x0A\x0D\x20-\xff]*$/
所以在空间之前不允许任何东西,除了HT,CR,LF和NUL

也就是说,仍然不知道为什么。

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

  • Chrome 5-20:
    0x0000
    -
    0xFFFF
  • 歌剧10.50-12.00:
    0x0000
    -
    0xFFFF
  • Safari 4.0-5.1.7:
    0x0000
    -
    0xFFFF
  • Firefox 3.5-16alpha:
    0x0000
    -
    0xD7FF
    0xE000
    -
    0xFFFE
    (0xD800-0xDFFF和0xFFFF在LS后以两个字符显示)
  • IE8、IE9、IE10PP6:
    0x0009
    0x000A
    0x000D
    0x0020
    -
    0xD7FF
    0xE000
    -
    0xFFFD
    。(其他范围被忽略或导致“无效参数”错误)。
    0x0000
    是一个空字节,它截断IE中的所有以下字符
因此,字符范围
0x20
-
0xD7FF
0xE000
-
0xFFFD
加上
0x09
0x0A
0x0D
是安全的。


我创建了三个测试用例:

  • 最快的测试用例,它创建一个包含所有字符的字符串,并在设置
    localStorage
  • 一种使用空格字符(0x20)作为分隔符的方法,用于正确处理创建长度为2的字符的浏览器
  • 最糟糕的方法,因为IE对无效字符串抛出错误。每个字符都要单独测试,这相当昂贵
  • 所有测试功能都在中可用,第一个测试用例如下所示:

    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;}
    }
    
    函数运行测试(下限、上限){
    试一试{
    如果(!window.localStorage){
    //我记得在一个较旧的Chrome版本(4)中,
    //localStorage==null
    返回“不支持本地存储”;
            }
    如果(isNaN(下限)| | isNaN(上限)| | lowerlimit>上限){
    返回“其中一个限制不是有效数字!”;
            }
    var i=下限-1;
    变量字符_范围=[];
    而(++i<上限)字符_范围.push(i);
    输入=String.fromCharCode.apply(字符串,字符范围);
    setItem('chartest',输入);
    output=localStorage.getItem('chartest');
    如果(输入==输出){
    返回true;
            }
    //哦,不平等!
    var结果=[];
    
    对于(i=0;iIs,是针对多个浏览器还是仅针对一个浏览器进行测试?您可能只在IE中进行了测试,因为我也在其他浏览器中创建并测试了该功能,显示了不同的结果(请参见其他答案)。Javascript使用UTF-16。您的正则表达式仅限于ASCII。