最紧凑的JSON数据的URL编码?

时间:2017-06-14 19:21:46

标签: javascript node.js encoding url-encoding url-shortener

前段时间我看到一个网站将游戏重播数据编码为unicode字符,以便您可以复制并粘贴地址以与朋友分享。我基本上想要做同样的事情 - 我在JavaScript对象中有一些数据,我想把它放到地址栏中。

我知道我可以使用jQuery.param或类似的东西,但我想要一个更紧凑的格式。

事实证明这对谷歌来说有点棘手。大多数搜索结果都会显示URL缩短器,这是截然不同的。我尝试在我的数据库中存储一个短URL以供以后查找。所有数据都应该在URL本身中。

我可以使用哪种编码方式?算法的链接或描述很好,但Node / JavaScript的要求会更好。

我只需要支持最新版本的Chrome稳定版,所以我不在乎旧浏览器是否无法处理unicode。我想我会将数据放在片段部分(#之后),所以我只需要支持适用于该片段的任何编码规则。我认为只允许任何事情,不是吗?

2 个答案:

答案 0 :(得分:1)

你去https://github.com/qntm/base65536& https://www.npmjs.com/package/base65536

  

Base65536是针对UTF-32编码的文本和Twitter优化的二进制编码。这个JavaScript模块base65536是这种编码的第一个实现。

It featured on hackernews前一段时间。

答案 1 :(得分:1)

这是enapupe's suggestion的实现:

import Msgpack from 'msgpack-lite';
import Base65536 from 'base65536';

export function uniencode(obj) {
    return Base65536.encode(Msgpack.encode(obj));
}

export function unidecode(str) {
    return Msgpack.decode(Base65536.decode(str));
}

用法:

let o = {foo:'bar',baz:[1,2,3,4,5],quux:'corge'};
console.log(uniencode(o).length,JSON.stringify(o).length); // 24, 46

即。 uniencode大约是JSON.stringify长度的一半,或者根据推特(.length并不能正确计算unicode。)Twitter将上述计为15个字符。更好的衡量标准是:

function len(str) {
    return [...str].length;
}

分别给出15和46。