使用localStorage进行javascript字符串压缩

使用localStorage进行javascript字符串压缩,javascript,unicode,compression,base64,local-storage,Javascript,Unicode,Compression,Base64,Local Storage,我在一个项目中使用localStorage,它需要存储大量数据,主要是int、bool和string类型的数据。我知道javascript字符串是unicode的,但是当存储在localStorage中时,它们会保持unicode吗?如果是这样的话,有没有一种方法可以压缩字符串以使用unicode字节中的所有数据,还是应该只使用base64并减少压缩?所有数据将存储为一个大字符串 编辑:现在我想起来,base64根本不会做太多压缩,数据已经在base64中,a-zA-Z0-9;:为65个字符。您

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


编辑:现在我想起来,base64根本不会做太多压缩,数据已经在base64中,
a-zA-Z0-9;:为65个字符。

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

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

希望这有帮助

当存储在本地存储中时,它们是否保持unicode格式?

将本地存储值定义为DOMString。作为16位单元的序列,使用。所以,是的,他们保持一致

有没有办法压缩字符串以使用unicode字节中的所有数据

“Base32k”编码应该为每个字符提供15位。base32k类型编码利用UTF-16字符中的完整16位,但会丢失一位以避免在双字字符上出错。如果原始数据是base64编码的,则每个字符仅使用6位。将这6位编码为base32k应将其压缩为原始大小的6/15=40%。见和


为了进一步减小大小,您可以将base64字符串解码为完整的8位二进制,使用一些已知的压缩算法(例如,请参阅)对其进行压缩,然后对压缩后的输出进行base32k编码。

有一个答案可能会有所帮助。有一个指向JavaScript压缩库的链接。

我最近不得不在localStorage中保存大量JSON对象

首先,是的,它们确实保持不变。但不要试图将对象之类的东西直接保存到本地存储。它必须是一个字符串

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

任何数字都可以通过执行类似(+num).toString(36)的操作从10的基数转换为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'
    }
}
同样,这也会因尺寸而得到回报。和重复。就我而言,它工作得非常好。但这取决于主题

所有这些都需要一个收缩函数和一个向后扩展函数

另外,我建议创建一个用于存储和检索本地存储数据的类。我发现那里没有足够的空间。所以写操作会失败。其他站点也可能写入本地存储,这可能会占用一些空间。有关更多详细信息,请参阅

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


编辑:另外,你会遇到很多人提到的LZW压缩。我已经实现了它,它适用于小字符串。但对于大字符串,它将开始使用无效字符,从而导致数据损坏。所以请小心,如果您朝着这个方向去做,那么javascript的Base64压缩测试将得到很好的解释。在使用“完整”时也需要实现。

我认为建议中没有这一点。我认为每个实现都可能不同。localStorage是unicode吗?还是javascript就是这样?我很确定javascript字符串是unicode,但我不知道是否是localstorage字符串。我认为存储在
localstorage
中的所有内容都应该在存储时返回。但是没有人知道我一直在使用base64编码。我用一个包含
,unicode平假名A,它不保存值(在google chrome中)。如果不是unicode,会是什么?ascii码?拉丁语什么的?我想知道是否有任何Javascript压缩算法可以用于localStorage。我正在寻找一种快速的、能够对大部分为文本的数据进行压缩的方法。我尝试了几种无损编码,但它们通常使用UTF-16字符,这在本地存储中不起作用。如果您对内容进行base64编码,当原始内容为ASCII时,最终的结果是内容比原始内容大。我将检查Golomb编码和JSZip,但我还没有尝试过它们。这可能会带来好的结果。这是另一篇可能会引起兴趣的帖子。不确定它是否与您的用例匹配,但有趣的是:我完成了Golomb编码的尝试,到目前为止,它对真实数据的效果很好(压缩率约为5%,并且仍然可读)。考虑到算法的速度,这是迄今为止我见过的最好的。Base64会使字符串大小增加30%,您确定压缩可以弥补这一点吗