25

我正在开发一个将使用 HTML5 localStorage 的应用程序。除了它必须是一个字符串之外,我在任何地方都找不到密钥是否有任何限制。

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

另外:空格呢?跨浏览器的 localStorage 键是否允许这样做?

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

4

4 回答 4

21

该规范要求设置键和值并将其作为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]。因此,源文档中的单个数字字符引用在某些情况下可能对应于 DOMString 中的两个 16 位单元(一个高代理项和一个低代理项)。有关字符串比较的问题,请参阅 DOM 中的字符串比较。

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

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

于 2013-11-11T02:22:36.267 回答
3

我能够从链接的 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 中是这样。还需要在其他浏览器中测试。

于 2013-11-11T01:21:46.140 回答
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

于 2013-11-11T01:32:58.607 回答
1

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

但是 Html 存储有大小限制。

于 2013-11-11T01:42:26.723 回答