JSON 数据的最紧凑 URL 编码?

Most compact URL encoding of JSON data?

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

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

事实证明这对 Google 有点棘手。大多数搜索结果都会出现 URL 缩短器,这是明显不同的。我 不是 试图在我的数据库中存储一个简短的 URL 以供以后查找。所有数据都应该在 URL 本身。

我可以为此使用什么编码? link 或算法的描述很好,但是 Node/JavaScript 的实现会更好。

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

好了https://github.com/qntm/base65536 & https://www.npmjs.com/package/base65536

Base65536 is a binary encoding optimised for UTF-32-encoded text and Twitter. This JavaScript module, base65536, is the first implementation of this encoding.

It featured on hackernews 前段时间

下面是 的实现:

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 长度的一半,根据 Twitter 的说法甚至更少(.length 不能正确计算 unicode。Twitter 将以上计算为 15 个字符)。更好的测量是:

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

分别给出 15 和 46。