2021年06月28日 | Ver 0.1.0公開。 |
アクセスするサイトに、URLパラメータ(クエリ文字列)を使って多くの情報を渡そうとする場合には、渡したい情報をいかに効率よくエンコードするかが問題となります。
URLCompressorライブラリは、URLに埋め込みたい情報を圧縮して、効率良くエンコードするための、JavaScriptで記述されたライブラリです。
例えばhttps://example.comというサイトにアクセスする場合に、本日は晴天なり。という文字列を送るとすると、パーセントエンコーディング(URLエンコード)では
と、非常に長いURLになります。一方で、同じ文字列をURLCompressorライブラリを使って送れば、
と、比較的短いURLで情報を送れます。
URLCompressorライブラリは、18kB程度のJavaScriptのコードで、minifyすれば、わずか6kB程度になります。軽量なので、WEBページに組み込んでも、読み込みに時間がかかりません。
URLCompressorライブラリは、デフォルトではURLパラメータに使える64種類の文字を使って圧縮しますが、バイナリで圧縮する事もできるので、URLCompressorライブラリを、ファイル圧縮のために使用する事もできます。
URLCompressorライブラリは、次のリンクをクリックするとダウンロードできます。
URLCompressorライブラリは、MITライセンスで配布しています。
記事冒頭でも述べたとおり、URLパラメータを使って、多くの情報をアクセス先のサイトに渡そうとすると、いかに効率よくその情報をエンコードできるかが重要になります。効率の悪いエンコード法を採用すると、渡せる情報量の割に、長いURLになってしまいます。
URLはいくらでも長くできるものではなく、おおよそ2000文字に収める必要があります。また、文字数の制限が問題にならない場合でも、トラフィック削減のためには、なるべくURLを短くするべきです。
本来URLパラメータに使えない文字(漢字や/、=、#等)を含む文字列を、URLパラメータで渡したい場合、パーセントエンコーディングする方法が一般的に使われます。しかし、パーセントエンコーディングは効率が悪く、漢字や、URLに使えない記号等が多く含まれていると、急激に文字数が増えてしまう性質があります。
例えば、
という8文字の漢字カナ交じり文をパーセントエンコーディングすると、
と、72バイトになってしまいます。
一方で、パーセントエンコーディング以外にも、Base 64 URLによるエンコードもよく使われます。
Base 64 URLを使用した場合、
は、
と、32バイトにエンコードされ、パーセントエンコーディングよりも、良い効率が得られます。
ただし、URLパラメータに使えない文字が全く含まれていない場合は、パーセントエンコーディングしても、元の文字列と同じaバイト数になるのに対し、Base 64 URLでエンコードする場合は、文字数が4/3に増えてしまいます。
例えば、
の14バイトをパーセントエンコーディングした場合は、
と、14バイトのままです。(スペースは+にエンコードされますが、エンコード前後で文字数は変わりません)
一方で、Base 64 URLでエンコードすると、
と19バイトに増えます。
この様に、URLパラメータで渡したい文字列の性質により、パーセントエンコーディングする方がいい場合と、Base 64 URLでエンコードする方がいい場合とがあります。
また、パーセントエンコーディングやBase 64 URLエンコードでは、渡したい文字列がとても長くなると、それに比例してエンコード結果が長くなるという問題もあります。数百バイト以上の長い文字列の場合、使用する文字の偏りや、同じフレーズが繰り返し出てくるなどの性質を利用して、情報を圧縮し、短い文字列にエンコードできる場合が多くあるのですが、パーセントエンコーディングやBase 64 URLエンコードではその様な処理をしていません。
この様な状況を鑑み、ほぼどの様なケースでも、パーセントエンコーディングやBase 64 URLと同等以上の効率が得られ、なおかつ、ある程度以上の長さの文字列をエンコードする場合は、高確率でエンコード前の文字列よりもさらに短い文字列にエンコードできるエンコード法がないかと考えて作ったのが、このURLCompressorです。
URLCompressorを使うと、
は
と、15バイトにエンコードされ(パーセントエンコーディングより1バイト多いが、Base 64 URLよりは4バイト少ない)、
は
と、31バイトにエンコードされます。(72バイトのパーセントエンコーディングや、32バイトのBase 64 URLエンコードよりも高効率)
さらに、次の章で示すとおり、文字列が数十~数百バイト以上になると、エンコード結果が元の文字列よりも短くなる事が高い確率で起こる様になります。
色々な文字列を、URLCompressorライブラリ、パーセントエンコーディング、Base 64 URLの3種類のエンコード法でエンコードした場合のバイト数を調べた結果を、表1に示します。
この表では、3種類のエンコード法の中で、最も少ないバイト数になった物を赤色で示しましたが、ほとんどのケースでURLCompressorライブラリでエンコードするのが最も少ないバイト数になる事が分かります。
また、ある程度エンコードする文字列が長い方が効率よくエンコードできる性質があり、表の最後の2例では、URLCompressorライブラリで圧縮すると、元の文字列よりも短くなっています。
文字列 (UTF-8表現のバイト数) |
URLCompressorライブラリでエンコードした場合のバイト数 | パーセントエンコーディングした場合のバイト数 | Base 64 URLでエンコードした場合のバイト数 |
---|---|---|---|
This is a pen. (14バイト)
|
15バイト | 14バイト | 19バイト |
http://www.yahoo.co.jp/ (23バイト)
|
23バイト | 31バイト | 31バイト |
本日は晴天なり。 (24バイト)
|
31バイト | 72バイト | 32バイト |
#include <stdio.h> int main() { puts("Hello"); return 0; } (62バイト)
|
66バイト | 90バイト | 83バイト |
{ "id": "01234", "name": "egg", "price": 123, "stock": 1234 } (69バイト)
|
58バイト | 121バイト | 92バイト |
吾輩は猫である。名前はまだ無い。 どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。 (571バイト)
|
442バイト | 1713バイト | 762バイト |
次のページでは、画面に文字列を入力し、URLCompressorでエンコードしたり、あるいは逆にデコードしたりできるツールを紹介します。