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.
下面是 的实现:
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。
前段时间我看到一个网站将游戏回放数据编码成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.
下面是
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。