Может ли HTML5 localStorage быть любой строкой?
Я работаю над приложением, использующим HTML5 localStorage. Я не могу найти нигде, есть ли какие-либо ограничения на ключ, кроме того, что он должен быть строкой.
В частности, я хотел бы знать, могу ли я использовать URL-адрес в качестве ключевого слова localStorage для всех браузеров, поддерживающих localStorage (например, в качестве ключей можно использовать символы :/?#[email protected]!$%^&*()[]{}|<>
).
Также: как насчет пробелов? Это разрешено в ключе локального хранилища в браузерах?
Я нашел этот раздел, но, по-видимому, он тестировал приемлемые строки в значениях localStorage (не ключей).
Ответы
Ответ 1
Спецификация требует, чтобы ключи и значения устанавливались и возвращались как значение типа 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 (высокий суррогат и низкий суррогат). Для вопросы, связанные со строковыми сравнениями, см. в String Comparisons in DOM.
Для Java и ECMAScript DOMString привязан к типу String, потому что оба языка также используют UTF-16 в качестве кодировки.
Официально любая законная строка UTF-16 является легальной как ключ или значение. Не каждый кодовой код UTF-16 является юридическим символом, поэтому вы должны стараться избегать определенных символов, таких как "суррогатные пары", "байтовые байки" и "зарезервированные символы".
Ответ 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. Все еще нужно протестировать в других браузерах.
Ответ 3
Простой тест для поддержки браузера и действительности ключа может быть:
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.
Ответ 4
да, вы можете кодировать эту строку.
но Html-хранилище имеет ограничение по размеру.