
HTMLソース(Unicode対応)を英数字のみからなる文字列に暗号化&LZ77圧縮
ダウンロード: http://www.vector.co.jp/soft/dl/other/java/se339562.html(Ver.040915)
実行: AlphamericHTML.html(Ver.040915)
65535種類もある Unicode の文字を英数字 [0-9A-Za-z_] のみで表そうとすると、計算上1文字につき英数字3文字が必要となり、2バイト文字では1.5倍に、1バイト文字では3倍にもサイズが膨れ上がることになります。
これではまずいので、割り当て文字数を減らす工夫を考えますが、まず、全角半角の英数字・記号・カタカナや平仮名などを優先して少ない文字数で割り当てるようにしました。さらに、Unicode 番号の近い文字同士をグループ化することにより、割り当て文字数を減らすこともしました。これらの処理により、1バイト文字と2バイト文字が混在した一般的なHTMLドキュメントで1.2倍ほどの増加に抑えることができました。
次に、今度は積極的に圧縮することを考え、これには、多くのアーカイバで採用されているLZ77アルゴリズムを使用しました。これにより、上記の1.2倍ほどの増加を加えても、トータルで6〜7割ほどのサイズに圧縮することができました。
当初、これをスクリプトで行うには速度の面で難がありましたが、このアルゴリズムの要である最長一致検索に、ビルトインメソッドの .lastIndexOf() を使うことで、スクリプトにしては高速なエンコードが実現しました。デコードは原理上非常に高速であり、スクリプトであっても瞬時に行われます。