perlで文字列を短く圧縮する方法

このQ&Aのポイント
  • perlで文字列を圧縮する方法について知りたいです。通し番号や日付などを数字で書く場合、桁数が大きくなるとパケットのサイズが気になります。文字列を圧縮して短くする方法はありますか?
  • 文字列を圧縮する方法について検討しています。例えば、バイナリレベルでの圧縮が可能なのか、また数字以外の文字が混じった場合にも対応できる方法があれば教えてください。
  • Compress::Zlibモジュールを使用して文字列を圧縮しましたが、出力結果が文字化けして使い物になりません。良い文字列圧縮方法はないでしょうか?
回答を見る
  • ベストアンサー

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);

  • Perl
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
回答No.1

圧縮のアルゴリズムは、たくさんあります。 どれを選ぶか、もしくは組み合わせるかの問題かと思います。 メジャーなところで、zipなどの圧縮を行い、base64等の符号化処理をするのが 良いのではないでしょうか。 テキストor非テキストの文字列  ↓ ZIPアルゴリズムで圧縮(縮める)  ↓ 非テキストの文字列  ↓ base64符号化(問題ある制御符号を無くすためちょっと伸ばす)  ↓ テキスト文字列(7ビット文字だけの組み合わせ文字列) ただし、アルゴリズムや符号化の方式を選び間違うと、 元の文字列より長くなることがあるので、注意してください。 例えば、256バイト以下の対象データをLZHアルゴリズムで圧縮すると、 256バイト以上の圧縮結果となります。 また、符号化方式も、識別のため前後にマジックワードが付与されたり するので、対象データが短すぎると、大元の対象データより長くなる可能性も あります。 なお、当然ですが、復元するのに仕組みが必要になるので、相手が携帯であれば 携帯側に、javaなどで復元処理を実装することになると思いますので、メジャーなものを 組み合わせれば、復元側も既存のモノを流用できて良いと思います。

mai_540903
質問者

補足

回答いただきありがとうございます。 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のみの短縮を目的)、個人の方が作成されている手法でも良いのですが、何か、良いものは無いでしょうかね? ご存知でしたら、教えてください。 宜しくお願い致します。

関連するQ&A

  • [perl]サーバの容量を節約するためにzip圧縮は有効ですか?

    最近、use Compress::Zlib;を使うと、圧縮ができるということを知ったのですが、アップロードしてあるファイルを全て(テキスト系のファイル)を圧縮して、ページを表示する度に解凍して表示するというのはいかがでしょうか? 掲示板のテキストファイル数ギガも、数百メガになってレンタルサーバを使っている場合、とても助かるのですが・・・ ただ、普通に考えて、ページを閲覧する度に、毎回毎回、zip解凍をさせてもいいものやら・・・ また、こういったサーバの容量節約法を聞いたことが無いので本当にやっても良いのか心配です。 一応、今考えているのは、PVが1万程度のところを考えています。 ご返答、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 文字列の圧縮・復元アルゴリズムで困っています

    昔専門学校でやったけれど完全に忘れてしまっている文字列圧縮・復元の アルゴリズムについて教えて頂きたいのです。 仕様としては文字列「AAAABBBCCDDDDDEF」と並んでいた場合に圧縮を 実行すると「A4B3C2D5EF」と文字列を圧縮し、復元の場合はこの文字列を元に 圧縮前の文字列「AAAABBBCCDDDDDEF」にするといった感じのものです。 C言語かC#言語で答えて頂けるとありがたいです。

  • 文字列置換

    UNIXのコマンドで文字列の置換を試みています。 今回行いたい置換としては。。。 12年 1986年2月12日 14 などの文字列を NUM年 NUM年NUM月NUM日 NUM などに、連続した数字をひとまとめにNUMに置換したいと考えています。 文字列の置換方法としてsedコマンドがあると聞いてしらべてみたのですが、いまいいち理解することができませんでした。 自分で考えて試してみたコマンドが以下の通りです。 sed -e "s/\([1-9]\{1,2,3,4\}\)/NUM/g" filename が・・・まったく置換はされませんでした。 よろしければお教えください。よろしくお願いいたします。

  • pythonにおけるメッセージについて

    pythonでクラスを書き、オブジェクトを作りそこにメッセージを送ることでオブジェクトの属性を変化させる、というのがオブジェクト指向であると学んでいました。 ここで >>> import zlib >>> s = 'witch which has which witches wrist watch' >>> t = zlib.compress(s) というのは圧縮する機械にメッセージを送ったら圧縮されたメッセージが出てくるイメージになります。 ここで 文字列を継承して圧縮関数?を加えた実装を考えます >>> s = 'witch which has which witches wrist watch' >>> t = s.compress("zip") これはそもそも可能でしょうか?できるとしてなぜ前者の実装となるのでしょうか? オブジェクト指向、というとオブジェクトにメッセージを送るとそのメッセージによってオブジェクトの変数が操作されると考えてきました。 そうなると後者のほうが正しように感じられます

  • PowerShell7で圧縮したファイル名文字化け

    PowerShell7で圧縮したファイル名が文字化けします。 siftjisとutf8の絡みだろうとは思いますが、回避方法が分かりません。 『C:\test\folder1』の中身を全て『C:\test\File_yyyyMMdd-hhmmss.zip』というファイルに圧縮するスクリプトが以下。 $STR_DATE=Get-Date -Format "yyyyMMdd-HHmmss" $FPF_ZIP="C:\test\File_" + $STR_DATE + ".zip" Compress-Archive -Path C:\Test\folder1\*.* -DestinationPath $FPF_ZIP 『C:\test\folder1』の中身にか下記のファイルが入っています。 新しいテキスト ドキュメント.txt 新規 OpenDocument 表計算.ods 圧縮して、それを解凍したらファイル名が文字化けします。 譁ー縺励>繝・く繧ケ繝・繝峨く繝・繝。繝ウ繝・txt 譁ー隕・OpenDocument 陦ィ險育ョ・ods これを回避する方法を教えてください。

  • perl:文字列を数値として変換 警告でないように

    ある変数に 文字列として 数値が格納されている。 ノイズがあり、時には その変数に 英字数字のごちゃ混ぜ文字列が入るときがある。 文字列には数字だけが入っている前提で処理すると、時に その場合、Argument "○○"isn't numeric in addition・・・エラーがでてしまう。 このエラーを出力したくない、エラーログファイルに 読込エラーだったレコード内容を吐き出すようにしたい。 文字列が数字のみで構成されている場合は ○○を実行し、数字以外で構成されている場合は XXを実行するという if文を作成したいと考えている。よい判定方法を教えてください。 現在は、 $i=$i+0; if( $i =~ /^\d+$/ ){ ○○} else{ XX}としているが、 $i=$i+0; の行でエラーが出てしまうときがある。

  • エクセルで複数の列から複数の文字列(数字)を選びたいです。

    エクセルで複数の列から複数の文字列(数字)を選びたいです。 A   B   C   D   E   F   G   H 1   12   1   4   5   8   6 2   36  7   2   5   6 3   55  3   4   88  1  3  8 5   87 上記のような表があったとき、C列からG列のいずれかに1、3、8のどれかが 含まれるとき、H列にB列の数字を入れたいのですが、どのようにすれば できるのでしょうか? この場合、A列の1,3,4段にそれぞれ12、55、88と入れたいということです。 よろしくおねがいいたします。

  • 文字列操作

    Visual Basic6.0 よろしくお願いします。 (1) a12bc34d56ef (2) a12bc3456 のような文字列から (1) 一番後ろの数字56 の前のa12bc34d (2) 一番後ろの数字3456 の前のa12bc を消して (1) 56ef (2) 3456 にしたい 場合はどうすれば良いでしょうか? 便利な関数や方法がありましたら教えてください。 お願いいたします。

  • Lhaplusでの圧縮後テキストが文字化け

    メモ帳で作ったテキストドキュメントをLhaplusで圧縮後、 元のテキストドキュメントが文字化けしてしまい、圧縮 もできませんでした。 この場合、テキストドキュメントを復元するにはどうしたら よいのでしょうか? また、圧縮する際、10記事のうち1記事が「アーカイブファイル ではありません。」と出ました。他の9記事同様に保存 したはずなのですが、よく意味がわからず困惑しています。 どうか詳しくご存知の方、ご回答ください。 Lhaplus version 1.59 Windows 7homepremium

  • 文字列から数値を抜き出して計算

    あいう 1200t×398h×1200L こういった数字混じりの文字列があります。 "あいう"とかの文字列が含まない場合もあります。 要は、thLの左の数値を抜き出して掛け算する関数はできますでしょうか? お手数かけますがよろしくお願いします

専門家に質問してみよう