Недавно мне пришлось сохранять огромные объекты JSON в localStorage.
Во-первых, да, они остаются в юникоде. Но не пытайтесь сохранить что-то вроде объекта прямо в локальное хранилище. Это должна быть строка.
Вот несколько методов сжатия, которые я использовал (которые, похоже, хорошо сработали в моем случае) перед преобразованием моего объекта в строку:
Любые числа можно преобразовать из базы 10 в базу 36, выполнив что-то вроде (+ num) .toString (36). Например, число 48346942 будет «ss8qm», что (включая кавычки) на 1 символ меньше. Возможно, добавление кавычек действительно увеличит количество символов. Таким образом, чем больше число, тем лучше выигрыш. Чтобы преобразовать его обратно, вы должны сделать что-то вроде parseInt ("ss8qm", 36).
Если вы сохраняете объект с любым ключом, который будет повторяться, лучше всего создать объект поиска, в котором вы назначите сокращенный ключ оригиналу. Итак, для примера, если у вас есть:
{
name: 'Frank',
age: 36,
family: [{
name: 'Luke',
age: 14,
relation: 'cousin'
}, {
name: 'Sarah',
age: 22,
relation: 'sister'
}, {
name: 'Trish',
age: 31,
relation: 'wife'
}]
}
Тогда вы могли бы это сделать:
{
// original w/ shortened keys
o: {
n: 'Frank',
a: 36,
f: [{
n: 'Luke',
a: 14,
r: 'cousin'
}, {
n: 'Sarah',
a: 22,
r: 'sister'
}, {
n: 'Trish',
a: 31,
r: 'wife'
}]
},
// lookup
l: {
n: 'name',
a: 'age',
r: 'relation',
f: 'family'
}
}
Опять же, это окупается размером. И повторение. В моем случае это сработало очень хорошо. Но это зависит от предмета.
Все это требует функции сжатия и расширения обратно.
Кроме того, я бы рекомендовал создать класс, который используется для хранения и извлечения данных из локального хранилища. Я столкнулся с нехваткой места. Так что записи не удастся. Другие сайты также могут записывать данные в локальное хранилище, что может занять часть этого места. См. этот пост для более подробной информации.
То, что я сделал в созданном мной классе, было первой попыткой удалить любой элемент с заданным ключом. Затем попробуйте setItem. Эти две строки заключены в пробную ловушку. В случае сбоя предполагается, что хранилище заполнено. Затем он очистит все в localStorage, пытаясь освободить для него место. Затем, после очистки, он снова попытается установитьItem. Это тоже связано с попыткой улова. Поскольку он может потерпеть неудачу, если сама строка больше, чем может обработать localStorage.
РЕДАКТИРОВАТЬ: Кроме того, вы встретите сжатие LZW, о котором упоминают многие люди. Я реализовал это, и это сработало для небольших строк. Но с большими строками он начнет использовать недопустимые символы, что приведет к повреждению данных. Так что будьте осторожны, и если вы пойдете в этом направлении test test test
person
Marshall
schedule
14.09.2011
localStorage
, должно быть возвращено в том виде, в котором вы это хранили. Но, как никто не знает, я все время использую кодировку base64. - person KARASZI István   schedule 29.07.2011あ
, unicode hiragana A, и оно не сохраняет значение (в google chrome). если это не юникод, что бы это было? ascii? латинский-что-то? - person invisible bob   schedule 29.07.2011