こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

perlで文字列を短く(圧縮)したい。

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

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

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

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

投稿日時 - 2006-01-20 20:06:53

QNo.1909589

暇なときに回答ください

質問者が選んだベストアンサー

圧縮のアルゴリズムは、たくさんあります。
どれを選ぶか、もしくは組み合わせるかの問題かと思います。

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

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


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

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

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

投稿日時 - 2006-01-21 00:39:00

補足

回答いただきありがとうございます。
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:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問