2017-06-14 6 views
1

しばらく前に、ゲーム再生データをユニコード文字にエンコードしたWebサイトを見て、アドレスをコピー&ペーストして友人と共有できるようにしました。私は基本的に同じことをしたい - 私はJavaScriptオブジェクト内のいくつかのデータを持って、私はアドレスバーに入れたい。JSONデータの最もコンパクトなURLエンコーディングですか?

私はjQuery.paramなどを使用できますが、もっとコンパクトなフォーマットが欲しいと思います。

これは、Googleにとってちょっと難しいことです。ほとんどの検索結果は、UR​​Lの短縮文字を生成しますが、これははっきりと異なります。私はではない私のデータベースに短いURLを保存して後で検索しようとしています。すべてのデータはURL自体に含まれている必要があります。

これにはどのようなエンコードを使用できますか?リンクやアルゴリズムの記述は問題ありませんが、ノード/ 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

Aha!それは問題の半分を解決します。もう半分は私の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)); 
} 

使用法:uniencodeすなわち

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

は(.lengthが正しくUnicodeをカウントしないのTwitterによるとさえ少ないJSON.stringifyの約半分の長さである、またはTwitterはこれを15文字と数えます)。より良い測定は:

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

それぞれ15と46です。

関連する問題