URLCompressorライブラリ(1)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (1) (2) (3) 次のページへ
2021年06月28日 Ver 0.1.0公開。

アクセスするサイトに、URLパラメータ(クエリ文字列)を使って多くの情報を渡そうとする場合には、渡したい情報をいかに効率よくエンコードするかが問題となります。

URLCompressorライブラリは、URLに埋め込みたい情報を圧縮して、効率良くエンコードするための、JavaScriptで記述されたライブラリです。

例えばhttps://example.comというサイトにアクセスする場合に、本日は晴天なり。という文字列を送るとすると、パーセントエンコーディング(URLエンコード)では

https://example.com?text=%E6%9C%AC%E6%97%A5%E3%81%AF%E6%99%B4%E5%A4%A9%E3%81%AA%E3%82%8A%E3%80%82

と、非常に長いURLになります。一方で、同じ文字列をURLCompressorライブラリを使って送れば、

https://example.com?text=DiX8ReaZzrfpP4jxuH4JVY0ne47QHoZ

と、比較的短いURLで情報を送れます。

URLCompressorライブラリは、18kB程度のJavaScriptのコードで、minifyすれば、わずか6kB程度になります。軽量なので、WEBページに組み込んでも、読み込みに時間がかかりません。

URLCompressorライブラリは、デフォルトではURLパラメータに使える64種類の文字を使って圧縮しますが、バイナリで圧縮する事もできるので、URLCompressorライブラリを、ファイル圧縮のために使用する事もできます。

目次

1. ダウンロード … 1ページ
2. ライセンス … 1ページ
3. URLCompressorライブラリの解決しようとしている課題 … 1ページ
4. URLCompressorライブラリの効率をパーセントエンコーディングやBase 64 URLと比較する … 1ページ
5. URLCompressorライブラリを使ったエンコード・デコードを試すためのツール … 2ページ
5-1. エンコードの方法 … 2ページ
5-2. デコードの方法 … 2ページ
5-3. 元の文字列のバイト数について … 2ページ
6. URLCompressorライブラリの応用例 … 2ページ
7. URLCompressorの使い方 … 3ページ
7-1. URLCompressorライブラリの読み込み方 … 3ページ
7-1-1. WEBページのクライアントサイドで使う場合 … 3ページ
7-1-2. Node.jsで使う場合 … 3ページ
7-2. URLCompressorライブラリの関数 … 3ページ
7-3. 圧縮(エンコード)の方法 … 3ページ
7-4. 伸長(デコード)の方法 … 3ページ
7-5. URLCompresor.encodeUtf8関数の使い方 … 3ページ
7-6. URLCompressor.decodeUtf8関数の使い方 … 3ページ

1.ダウンロード

URLCompressorライブラリは、次のリンクをクリックするとダウンロードできます。

URLCompressorライブラリ Version 0.1.0のダウンロード url-comp-0-1-0.zip (15kB)

2.ライセンス

URLCompressorライブラリは、MITライセンスで配布しています。

3.URLCompressorライブラリの解決しようとしている課題

記事冒頭でも述べたとおり、URLパラメータを使って、多くの情報をアクセス先のサイトに渡そうとすると、いかに効率よくその情報をエンコードできるかが重要になります。効率の悪いエンコード法を採用すると、渡せる情報量の割に、長いURLになってしまいます。

URLはいくらでも長くできるものではなく、おおよそ2000文字に収める必要があります。また、文字数の制限が問題にならない場合でも、トラフィック削減のためには、なるべくURLを短くするべきです。

本来URLパラメータに使えない文字(漢字や/、=、#等)を含む文字列を、URLパラメータで渡したい場合、パーセントエンコーディングする方法が一般的に使われます。しかし、パーセントエンコーディングは効率が悪く、漢字や、URLに使えない記号等が多く含まれていると、急激に文字数が増えてしまう性質があります。

例えば、

本日は晴天なり。

という8文字の漢字カナ交じり文をパーセントエンコーディングすると、

%E6%9C%AC%E6%97%A5%E3%81%AF%E6%99%B4%E5%A4%A9%E3%81%AA%E3%82%8A%E3%80%82

と、72バイトになってしまいます。

一方で、パーセントエンコーディング以外にも、Base 64 URLによるエンコードもよく使われます。

Base 64 URLを使用した場合、

本日は晴天なり。

は、

5pys5pel44Gv5pm05aSp44Gq44KK44CC

と、32バイトにエンコードされ、パーセントエンコーディングよりも、良い効率が得られます。

ただし、URLパラメータに使えない文字が全く含まれていない場合は、パーセントエンコーディングしても、元の文字列と同じaバイト数になるのに対し、Base 64 URLでエンコードする場合は、文字数が4/3に増えてしまいます。

例えば、

This is a pen.

の14バイトをパーセントエンコーディングした場合は、

This+is+a+pen.

と、14バイトのままです。(スペースは+にエンコードされますが、エンコード前後で文字数は変わりません)

一方で、Base 64 URLでエンコードすると、

VGhpcyBpcyBhIHBlbi4

と19バイトに増えます。

この様に、URLパラメータで渡したい文字列の性質により、パーセントエンコーディングする方がいい場合と、Base 64 URLでエンコードする方がいい場合とがあります。

また、パーセントエンコーディングやBase 64 URLエンコードでは、渡したい文字列がとても長くなると、それに比例してエンコード結果が長くなるという問題もあります。数百バイト以上の長い文字列の場合、使用する文字の偏りや、同じフレーズが繰り返し出てくるなどの性質を利用して、情報を圧縮し、短い文字列にエンコードできる場合が多くあるのですが、パーセントエンコーディングやBase 64 URLエンコードではその様な処理をしていません。

この様な状況を鑑み、ほぼどの様なケースでも、パーセントエンコーディングやBase 64 URLと同等以上の効率が得られ、なおかつ、ある程度以上の長さの文字列をエンコードする場合は、高確率でエンコード前の文字列よりもさらに短い文字列にエンコードできるエンコード法がないかと考えて作ったのが、このURLCompressorです。

URLCompressorを使うと、

This is a pen.

2oeRAu5aWC177mp

と、15バイトにエンコードされ(パーセントエンコーディングより1バイト多いが、Base 64 URLよりは4バイト少ない)、

本日は晴天なり。

DiX8ReaZzrfpP4jxuH4JVY0ne47QHoZ

と、31バイトにエンコードされます。(72バイトのパーセントエンコーディングや、32バイトのBase 64 URLエンコードよりも高効率)

さらに、次の章で示すとおり、文字列が数十~数百バイト以上になると、エンコード結果が元の文字列よりも短くなる事が高い確率で起こる様になります。

4.URLCompressorライブラリの効率をパーセントエンコーディングやBase 64 URLと比較する

色々な文字列を、URLCompressorライブラリ、パーセントエンコーディング、Base 64 URLの3種類のエンコード法でエンコードした場合のバイト数を調べた結果を、表1に示します。

この表では、3種類のエンコード法の中で、最も少ないバイト数になった物を赤色で示しましたが、ほとんどのケースでURLCompressorライブラリでエンコードするのが最も少ないバイト数になる事が分かります。

また、ある程度エンコードする文字列が長い方が効率よくエンコードできる性質があり、表の最後の2例では、URLCompressorライブラリで圧縮すると、元の文字列よりも短くなっています。

表1、URLCompressorライブラリ、パーセントエンコーディング、Base 64 URLにより、色々な文字列をエンコードした場合のバイト数の比較
文字列
(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でエンコードしたり、あるいは逆にデコードしたりできるツールを紹介します。

目次へ  前のページへ (1) (2) (3) 次のページへ

関連ページ

Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。