首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用localStorage进行javascript字符串压缩

使用localStorage进行javascript字符串压缩
EN

Stack Overflow用户
提问于 2011-07-29 04:21:56
回答 4查看 11.1K关注 0票数 20

我在一个项目中使用localStorage,它需要存储大量的数据,主要是整型、布尔型和字符串类型。我知道javascript字符串是unicode,但是当它们存储在localStorage中时,它们会保持unicode吗?如果是这样的话,有没有一种方法可以压缩字符串以使用unicode字节中的所有数据,或者我应该只使用base64而压缩较少?所有数据都将存储为一个大字符串。

编辑:现在我想一想,base64根本不会做太多的压缩,数据已经是64位的了,a-zA-Z0-9 ;:是65个字符。

EN

回答 4

Stack Overflow用户

发布于 2011-09-13 01:17:21

您可以编码为Base64,然后实现一个简单的无损压缩算法,比如游程编码或Golomb编码。这应该不会太难,而且可能会给你一点压力。

Golomb encoding

我还找到了JsZip。我猜你可以检查代码,并且只使用算法,如果它是兼容的。

希望这能有所帮助。

http://jszip.stuartk.co.uk/

票数 7
EN

Stack Overflow用户

发布于 2011-09-15 02:15:19

我最近不得不用localStorage保存巨大的JSON对象。

首先,是的,它们确实保留了unicode。但是,不要尝试将对象之类的内容直接保存到本地存储中。它需要是一个字符串。

以下是我在将对象转换为字符串之前使用的一些压缩技术(在我的例子中似乎工作得很好):

通过执行类似(+num).toString( 36 )的操作,可以将任何数字从基数10转换为基数36。例如,数字48346942将是"ss8qm“,它(包括引号)少了1个字符。添加引号实际上可能会增加字符数。因此,数字越大,回报越好。要将其转换回来,您可以执行类似于parseInt("ss8qm",36)的操作。

如果你正在存储一个带有任何重复键的对象,最好创建一个查找对象,在这个对象中,你可以给原始对象分配一个缩短的键。所以,为了举例,如果你有:

代码语言:javascript
复制
{
    name: 'Frank',
    age: 36,
    family: [{
        name: 'Luke',
        age: 14,
        relation: 'cousin'
    }, {
        name: 'Sarah',
        age: 22,
        relation: 'sister'
    }, {
        name: 'Trish',
        age: 31,
        relation: 'wife'
    }]
}

然后你就可以做到:

代码语言:javascript
复制
{
    // 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'
    }
}

同样,这在大小上是值得的。和重复。在我的例子中,它工作得非常好。但这取决于主题。

所有这些都需要一个函数来收缩,一个函数来扩展。

另外,我建议创建一个用于从本地存储中存储和检索数据的类。我遇到了没有足够空间的情况。因此写入将会失败。其他站点也可能写入本地存储,这可能会占用一些空间。有关更多详细信息,请参阅this post

在我构建的类中,我所做的是第一次尝试删除具有给定键的任何项。然后尝试setItem。这两行代码用try catch包起来。如果失败,则假定存储已满。然后,它将清除localStorage中的所有内容,以便为其腾出空间。然后,在清除之后,它将再次尝试setItem。这也包含在try catch中。因为如果字符串本身大于localStorage可以处理的大小,它可能会失败。

编辑:还有,你会遇到很多人提到的LZW压缩。我已经实现了这一点,它对小字符串有效。但对于大型字符串,它将开始使用无效字符,从而导致数据损坏。所以要小心,如果你要进行方向测试测试

票数 7
EN

Stack Overflow用户

发布于 2011-09-14 20:46:11

This Stackoverflow Question有一个可能会有帮助的答案。这里有一个指向JavaScript压缩库的链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6865185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档