我正在开发一个使用HTML5 localStorage的应用程序。除了它必须是一个字符串之外,我无法找到关键是否有任何限制。
具体来说,我想知道是否可以在支持localStorage的所有浏览器中使用URL作为localStorage中的密钥(例如,允许在密钥中使用:/?#._-=+@!$%^&*()[]{}|<>
等符号?)。
另外:空白怎么样?是否允许跨浏览器的localStorage密钥?
我找到了this topic,但它似乎只测试了localStorage值(而不是键)中可接受的字符串。
答案 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中测试过。
答案 3 :(得分:0)
是的,您可以对该字符串进行编码。
但是Html存储有大小限制。