Javascript 如何压缩字符串?

Javascript 如何压缩字符串?,javascript,compression,svg,Javascript,Compression,Svg,我希望对一种类型的字符串进行可逆压缩,这样我就可以在URL中包含它,而不必跟踪它所指的内容。我要压缩的字符串是SVG路径字符串,下面是一个简短的入门: 基本上,字符串包含一个字符,后跟任意数量的整数,然后是另一个字符,后跟任意数量的整数,依此类推 如果有人知道这方面的好资源,将不胜感激 Jason许多压缩算法都有很好的文档记录,其中一些甚至有js实现: 一个普通的(合理的)好的压缩算法,我知道有一个JSIMPL,我只是在寻找URL 另一个问题指向JS中的LZW实现 (我这样做了,但它使用的模型

我希望对一种类型的字符串进行可逆压缩,这样我就可以在URL中包含它,而不必跟踪它所指的内容。我要压缩的字符串是SVG路径字符串,下面是一个简短的入门:

基本上,字符串包含一个字符,后跟任意数量的整数,然后是另一个字符,后跟任意数量的整数,依此类推

如果有人知道这方面的好资源,将不胜感激


Jason

许多压缩算法都有很好的文档记录,其中一些甚至有js实现:

  • 一个普通的(合理的)好的压缩算法,我知道有一个JSIMPL,我只是在寻找URL

  • 另一个问题指向JS中的LZW实现

  • (我这样做了,但它使用的模型很愚蠢,因此没有达到它所能达到的最佳压缩率)


    • 你可以试试。不同字符的数量为20-30,如果字符串较长,则压缩应有效

      听起来您可能受益于单RLE压缩和双RLE压缩

      在这里可以看到这方面的底漆:


      该库应该足够灵活,可以将压缩模式修改为更可取的模式。本文解释了这是如何工作的;这可能是优化SVG案例的良好开端。

      以下解决方案返回一个压缩的Base64编码字符串

      使用下面的代码创建一个名为zip.js的文件,然后查看下面的用法

      // Apply LZW-compression to a string and return base64 compressed string.
      export function zip (s) {
        try {
          var dict = {}
          var data = (s + '').split('')
          var out = []
          var currChar
          var phrase = data[0]
          var code = 256
          for (var i = 1; i < data.length; i++) {
            currChar = data[i]
            if (dict[phrase + currChar] != null) {
              phrase += currChar
            } else {
              out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0))
              dict[phrase + currChar] = code
              code++
              phrase = currChar
            }
          }
          out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0))
          for (var j = 0; j < out.length; j++) {
            out[j] = String.fromCharCode(out[j])
          }
          return utoa(out.join(''))
        } catch (e) {
          console.log('Failed to zip string return empty string', e)
          return ''
        }
      }
      
      // Decompress an LZW-encoded base64 string
      export function unzip (base64ZippedString) {
        try {
          var s = atou(base64ZippedString)
          var dict = {}
          var data = (s + '').split('')
          var currChar = data[0]
          var oldPhrase = currChar
          var out = [currChar]
          var code = 256
          var phrase
          for (var i = 1; i < data.length; i++) {
            var currCode = data[i].charCodeAt(0)
            if (currCode < 256) {
              phrase = data[i]
            } else {
              phrase = dict[currCode] ? dict[currCode] : oldPhrase + currChar
            }
            out.push(phrase)
            currChar = phrase.charAt(0)
            dict[code] = oldPhrase + currChar
            code++
            oldPhrase = phrase
          }
          return out.join('')
        } catch (e) {
          console.log('Failed to unzip string return empty string', e)
          return ''
        }
      }
      
      // ucs-2 string to base64 encoded ascii
      function utoa (str) {
        return window.btoa(unescape(encodeURIComponent(str)))
      }
      // base64 encoded ascii to ucs-2 string
      function atou (str) {
        return decodeURIComponent(escape(window.atob(str)))
      }
      
      顺便说一句。。。如果你担心逃生/逃生被贬值,请考虑<
      来自

      RLE的LZW算法和base64编码根本无法很好地压缩SVG路径数据。GZip链接似乎已断开:|
      import { zip, unzip } from './zip'
      
      // Zip a string
      const str = 'zip it'
      const base64CompressedString = zip(str)
      
      // Zip an object
      const obj = { a: 123, b: 'zipit' }
      const base64CompressedString = zip(JSON.stringify(obj))
      
      // Unzip the base64 compressed string back to an object.
      const originalObject = JSON.parse(unzip(base64CompressedString))