2017-06-14 56 views
1

前段時間,我看到一個網站,它將遊戲重播數據編碼爲unicode字符,以便您可以複製並粘貼地址以便與朋友分享。我基本上想做同樣的事情 - 我在JavaScript對象中有一些數據,我想把它放到地址欄中。JSON數據的最簡潔的URL編碼?

我知道我可以使用jQuery.param或類似的東西,但我想要一個更緊湊的格式。

原來這對谷歌有點棘手。大多數搜索結果都會顯示URL縮寫,這是明顯不同的。我是而不是試圖在我的數據庫中存儲一個短URL以便以後查找。所有的數據應該在URL本身。

我可以使用什麼編碼?該算法的鏈接或描述很好,但對Node/JavaScript的支持會更好。

我只需要支持最新版本的Chrome穩定版,所以我不在乎舊版瀏覽器是否無法處理unicode。我想我會把數據放在片段部分(在#之後),所以我只需要支持適用於該片段的任何編碼規則。我認爲任何事情都可以,不是嗎?

回答

1

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

Base65536是UTF-32編碼的文本和Twitter進行了優化的二進制編碼。這個JavaScript模塊base65536是這種編碼的第一個實現。

It featured on hackernews前一段時間。

+0

啊哈!這解決了一半的問題。另一半是如何將我的JS對象序列化到緩衝區中? 'JSON.stringify'? msgpack? – mpen

+0

是的,我想是的,你需要一個正常的字符串,所以你可以編碼,然後解碼和JSON.parse它。 – enapupe

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 

uniencodeJSON.stringify大約長度的一半,甚至更少根據推特(.length不能正確計算的unicode 。Twitter將上述數字計爲15個字符)。更好的測量是:

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

它分別給出15和46。