HTML5 localStorage 密钥可以是任何字符串

Can an HTML5 localStorage key be any string?

本文关键字:任何 字符串 localStorage 密钥 HTML5      更新时间:2023-09-26

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

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

另外:空白呢?在跨浏览器的本地存储密钥中是否允许这样做?

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

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

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

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

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

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

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。

是的,你可以对那个字符串进行编码。

但 Html 存储有大小限制。