dポイントプレゼントキャンペーン実施中!

通し番号や、日付などを数字で書く場合、
100
101
なら、まだいいのですが、
100000000000
100000000001
と続き、更に、桁が大きくなると、携帯電話などで見る場合パケットが気になります。
そこで、文字を圧縮する原理を利用して、簡単に圧縮できないでしょうか?

例えば
100000000000
左(L)から1が(g)1つで(d)0が(g)8つ
L1g1d0g11
こうすると、短くないますよね。
バイナリレベルで上手に圧縮するともっと、短く正確にできるのではないかと思っています。

他にも、探して、下記のようなものも見つけたのですが、圧縮されたものを、print出力してみると、文字化けしていて使えそうにありませんでした。
何か、良い方法は無いでしょうか?
また、数字以外の文字が混じった場合でも対応できれば、更に助かります。
宜しくお願い致します。

use Compress::Zlib;
$num = compress($num);
$num = uncompress($num);

A 回答 (1件)

圧縮のアルゴリズムは、たくさんあります。


どれを選ぶか、もしくは組み合わせるかの問題かと思います。

メジャーなところで、zipなどの圧縮を行い、base64等の符号化処理をするのが
良いのではないでしょうか。

テキストor非テキストの文字列
 ↓
ZIPアルゴリズムで圧縮(縮める)
 ↓
非テキストの文字列
 ↓
base64符号化(問題ある制御符号を無くすためちょっと伸ばす)
 ↓
テキスト文字列(7ビット文字だけの組み合わせ文字列)


ただし、アルゴリズムや符号化の方式を選び間違うと、
元の文字列より長くなることがあるので、注意してください。

例えば、256バイト以下の対象データをLZHアルゴリズムで圧縮すると、
256バイト以上の圧縮結果となります。
また、符号化方式も、識別のため前後にマジックワードが付与されたり
するので、対象データが短すぎると、大元の対象データより長くなる可能性も
あります。

なお、当然ですが、復元するのに仕組みが必要になるので、相手が携帯であれば
携帯側に、javaなどで復元処理を実装することになると思いますので、メジャーなものを
組み合わせれば、復元側も既存のモノを流用できて良いと思います。

この回答への補足

回答いただきありがとうございます。
perl入門者ですので、とりあえず、分かる範囲内でやってみました。

use Compress::Zlib;

$num = compress($num);
print $num;
print "\n<br>";

use MIME::Base64 ();
$num = MIME::Base64::encode($num);

print $num;
print "\n<br>";

$num = MIME::Base64::decode($num);

print $num;
print "\n<br>";

$num = uncompress($num);
print $num;
print "\n<br>";

としてみたのですが、
100文字を、75文字程度にすることができました。
もう少し、圧縮率を上げることはできないものでしょうかね?
また、”+=/”を含まないA-Za-z0-9のみで、Base64のような方法は無いものでしょうかね?

また、全て、サーバー側で処理して行うため(今回は、URLのみの短縮を目的)、個人の方が作成されている手法でも良いのですが、何か、良いものは無いでしょうかね?
ご存知でしたら、教えてください。
宜しくお願い致します。

補足日時:2006/01/21 16:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!