Может ли 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-хранилище имеет ограничение по размеру.