- ベストアンサー
複数行URLエンコードができるCGIまたはTOOL(エディタなど)を探しています
よろしくお願い致します。 題名にもありますが、日本語文字列をURLエンコードできるTOOL、またはCGIはありませんでしょうか? JavaScriptでもOKです。 例) あいうえお→ %82%A0%82%A2%82%A4%82%A6%82%A8 東京都→ %93%8C%8B%9E%93s といった具合に変換したいのです。 参考のサイトしては、 http://www.geocities.co.jp/SilkRoad/4511/vb/urlenc.htm にある、 http://www.geocities.co.jp/SilkRoad/4511/vb/sample/vbsurlen.htm のような感じで、複数行を一括でURLエンコードできると良いです。 私はあるデータベースのサイトを運営しており、某地図サイトの地図リンク機能を付け加えようと思ったのですが、数千件のデータを扱っているので1つ1つ変換するのも膨大に時間がかかってしまうので、できればCGIやTOOLで一括に(データを複数に分割して変換しても良いですが)変換できたら良いなと思っています。 データベースの検索にはCGIROOMさんの所で配布されている、「検索専用データベースVer1.44」を使用しています。 (CGIROOM:http://cgiroom.nu/) 検索後の出力時に、URLエンコードを行う機能をつけれればベストなのですが、私の技量では付け加えれるだけの知識はありません。 もし簡単にこのような機能を付け加えることができるのであれば、御教授お願い致します。 いろいろとサイトやTOOLを探してみたのですが、URLデコードがはるかに多く(当然のことですが)見つけることはできませんでした。 今後、サイトをより便利に使いやすくするためにも、地図リンク機能を是非付加えたいと思っています。 長くなってしまいましたが、宜しくお願い致します。 (もしこちらで回答されるのに支障がありましたら、メールでの回答でも承ります。)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もう一度だけ答えます。(これでわからなかったらあきらめるが吉) 1)まず、エンコードしたものを吐き出すCGIは以下 #!/usr/bin/perl open IS, "data.csv"; open OS, ">edata.csv"; foreach(<IS>) { @line=split /,/; foreach (0..$#line) { $line[$_]=~ s/(\W)/'%'.unpack("H2",$1)/eg; }; print OS join(",",@line)."\n"; } print "Content-type: text/html; charset=Shift_JIS\n\n"; print "エンコード版出力OK!"; 以上のCGIをedata.cgi と名づけ、今のdatabase.cgi と全く同じディレクトリに 置く。そして、一度実行(http://~/edata.cgiなどとする。1度OK) これを実行すると、data.cvs を一括で読みこみ、エンコードされて、edata.csvという日本語や記号をエンコードしたデータを作成します。 FTPでダウンロードなり何なりして中身を確認すればOK。 2)普段から、エンコードされた文字列を吐き出すのはdatabase.cgiを以下のように修正 #◆補助機能 # 「print<<HTML;」の前にこれらを記述するとデータを編集できます。 # &comma($data[**]); # 数値に自動でコンマを入れます。つまり 10000 が 10,000 と成ります。 # tag($data[**]); # タグなどに使用される記号を無効させます。 @edata=@data; foreach(@edata) { s/(\W)/'%'.unpack("H2",$1)/eg; } $print .=<<HTML; <!-- 該当 --> <table border=0 width="100%"> <tr bgcolor="#EEEEEE"><td width="30%" align=right>商品名 </td><td width="70%"> $edata[2] </td></tr> <tr><td align=right bgcolor="#F0F1E7">商品ナンバー </td><td width="70%"> $edata[1] </td></tr> <tr><td align=right bgcolor="#F0F1E7">お値段 </td><td width="70%">$edata[3]</td></tr> <tr><td align=right bgcolor="#F0F1E7">説明 </td><td width="70%"> $edata[4] </td></tr> <tr><td align=right > </td><td width="70%"> </td></tr> </table> <!-- 該当 --> 途中のforeach文の挿入や、$data[*] と $edata[*]の違いなど良く見て 修正すること。
その他の回答 (2)
- haporun
- ベストアンサー率40% (230/562)
sub hexenc{ my @ary, $dat; @ary = unpack("C*", @_[0]); $dat = ''; foreach(@ary){ $dat .= sprintf("%%%0.2x", $_); } return $dat; } を関数として $data = hexenc("あいうえお"); とかやってみてください。 ダメだったらまた言ってください。
お礼
haporunさん、御回答ありがとうございます。 kokucho81さんが、新たにアドバイスして頂ける前に、いろいろと試してみたのですが、上手くいきませんでした。 ですが、回答して頂いただけでも嬉しく思います。 ありがとうございました。 これからもよろしくお願い致します。 では失礼します。
- kokucho81
- ベストアンサー率61% (157/255)
いや~、教えてGOOに来るのも久しぶりだな~。 ひとつ回答して行くかな。 なになにですと? ふむふむ。 エンコードは $line =~ s/(\W)/'%'.unpack("H2",$1)/eg; で$lineの中に入った文字列がエンコードできまするぞ。 CGIに合わせて改造しなされ。 なにかファイルをエンコードしたいということであれば、 while(<>) { s/(\W)/'%'.unpack("H2",$1)/eg; print; } としたファイルをconv.pl とでも名づけ、 「perl conv.pl エンコードしたいデータファイル名 > エンコードしたものを出力したいファイル名」 とすれば、しゃかしゃかエンコードしてくれますじゃろ。 ではでは、さらば。
お礼
kokucho81さん、御回答ありがとうございます。 いろいろと試してみたのですが、エンコードをすることはできませんでした。 検索CGIのスクリプトに、記述する場所を変えてみたり、「$line」を出力させたい変数(?)「$data[*]」に変えてみたりしてみましたが、やはりダメでした。 もう少し、詳しく御説明したいと思います。 エクセルで作成されたデータを使い、データ検索をさせています。 出力側には$data[*]というのを使用しています。 「*」にはエクセルでの列番号を表しており、その列で該当するデータがあれば、その文字列を表示するようになっています。 例えば$data[2]としますと、エクセルで2列目の中で検索のキーワードに該当する文字列を表示させる。と言うことです。 単純に $line =~ s/(\W)/'%'.unpack("H2",$1)/eg; を $data[*] =~ s/(\W)/'%'.unpack("H2",$1)/eg; と変更したものを記述してみたのですが、上手くいきませんでした。 具体的には&data[*]には住所が入ることになっており、この住所をURLエンコードして、地図リンク機能に使える状態で出力することがしたいと思っております。 CGI(Perl)については、Readmeに書いてあることぐらいしか、いじれないので御教授して頂ければ、大変助かります。 何卒、よろしくお願い致します。 では、失礼します。
お礼
kokuchoさん、再度回答して頂きありがとうございます。 先程、教えて頂いた通りにスクリプトを追加・修正して、実行してみたところ、私が希望した通りにエンコードされた形で表示されました。 また、地図リンクサービスに使用できるように編集して、実行してみたところ、こちらも該当する住所の地図を表示できるようになりました。 今まで様々なCGI関連のサイトで、URLリンクの方法などを見てきましたが、知識がない私にはどのようにして組み込んだら良いのか、ほとんど分からず半分諦めかけていたところです。 こちらで最後の頼みとして質問させて頂いて、良かったと思います。 そして、kokucho81さんに御教授して頂けたことを、大変嬉しく思います。 なんとお礼を申上げたら良いのか、言葉が見つかりません。 今まで数カ月悩んでいたことが、やっと解決できました。 本当にありがとうございました。 心からお礼を申し上げたいと思います。 またこちらでご質問させて頂くことがあるやも知れませんが、よろしくお願い致します。 それでは、失礼致します。