HTML5 localStorage键可以是任何字符串吗?

时间:2013-11-11 01:10:56

标签: javascript html5 cross-browser local-storage

我正在开发一个使用HTML5 localStorage的应用程序。除了它必须是一个字符串之外,我无法找到关键是否有任何限制。

具体来说,我想知道是否可以在支持localStorage的所有浏览器中使用URL作为localStorage中的密钥(例如,允许在密钥中使用:/?#._-=+@!$%^&*()[]{}|<>等符号?)。

另外:空白怎么样?是否允许跨浏览器的localStorage密钥?

我找到了this topic,但它似乎只测试了localStorage值(而不是键)中可接受的字符串。

4 个答案:

答案 0 :(得分:19)

规范要求设置键和值,并将其作为DOMString类型值返回。 DOMString在[DOM Level 3 Core] [1]中描述为:

A DOMString is a sequence of 16-bit units.

IDL Definition

    valuetype DOMString sequence<unsigned short>;
  

选择UTF-16编码是因为其广泛的行业   实践。请注意,对于HTML和XML,文档字符集   (因此数字字符引用的表示法)是基于的   关于UCS [ISO / IEC 10646]。 a中的单个数字字符引用   因此,源文档在某些情况下可能对应于两个16位   DOMString中的单位(高代理人和低代理人)。对于   与字符串比较相关的问题,请参阅字符串比较   DOM。

     

对于Java和ECMAScript,DOMString绑定到String类型,因为   两种语言也使用UTF-16作为编码。

正式地说,任何合法的UTF-16字符串都是合法的键或值。并非每个UTF-16代码点都是合法字符,因此您应该尽量避免某些符号,如“代理对”,“字节顺序标记”和“保留字符”。

答案 1 :(得分:2)

我能够从链接的StackOverflow主题调整测试以测试密钥:

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(input, input);
        output = localStorage.getItem(input);
        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_test(0x20, 0xD7FF);

结果似乎相同,至少在Chrome中是这样。还需要在其他浏览器中测试。

答案 2 :(得分:2)

浏览器支持和密钥有效性的简单测试可能是:

var testKey = "test";
var value = "some value";

if(typeof(Storage)!=="undefined") {
  console.log("localStorage and sessionStorage support!");
  console.log("About to save. Local storage is:");
  console.log(localStorage);
  localStorage[testKey] = value;
  console.log("Key saved: "+ testKey);
  console.log(localStorage);
  localStorage.removeItem(testKey);  //<--- key deleted here
  console.log("key deleted: " + testKey);
  console.log(localStorage);
  console.log("DONE ===");
} else {
  console.log("Sorry! No web storage support..");
}

我已在使用控制台运行的Chrome中测试过。

改编自http://www.w3schools.com/html/html5_webstorage.asp

答案 3 :(得分:0)

是的,您可以对该字符串进行编码。

但是Html存储有大小限制。