よろしくお願い致します。

題名にもありますが、日本語文字列を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/urle …
にある、
http://www.geocities.co.jp/SilkRoad/4511/vb/samp …
のような感じで、複数行を一括でURLエンコードできると良いです。

私はあるデータベースのサイトを運営しており、某地図サイトの地図リンク機能を付け加えようと思ったのですが、数千件のデータを扱っているので1つ1つ変換するのも膨大に時間がかかってしまうので、できればCGIやTOOLで一括に(データを複数に分割して変換しても良いですが)変換できたら良いなと思っています。

データベースの検索にはCGIROOMさんの所で配布されている、「検索専用データベースVer1.44」を使用しています。
(CGIROOM:http://cgiroom.nu/
検索後の出力時に、URLエンコードを行う機能をつけれればベストなのですが、私の技量では付け加えれるだけの知識はありません。
もし簡単にこのような機能を付け加えることができるのであれば、御教授お願い致します。

いろいろとサイトやTOOLを探してみたのですが、URLデコードがはるかに多く(当然のことですが)見つけることはできませんでした。
今後、サイトをより便利に使いやすくするためにも、地図リンク機能を是非付加えたいと思っています。

長くなってしまいましたが、宜しくお願い致します。
(もしこちらで回答されるのに支障がありましたら、メールでの回答でも承ります。)

このQ&Aに関連する最新のQ&A

A 回答 (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[*]の違いなど良く見て
修正すること。
    • good
    • 0
この回答へのお礼

kokuchoさん、再度回答して頂きありがとうございます。

先程、教えて頂いた通りにスクリプトを追加・修正して、実行してみたところ、私が希望した通りにエンコードされた形で表示されました。
また、地図リンクサービスに使用できるように編集して、実行してみたところ、こちらも該当する住所の地図を表示できるようになりました。

今まで様々なCGI関連のサイトで、URLリンクの方法などを見てきましたが、知識がない私にはどのようにして組み込んだら良いのか、ほとんど分からず半分諦めかけていたところです。
こちらで最後の頼みとして質問させて頂いて、良かったと思います。
そして、kokucho81さんに御教授して頂けたことを、大変嬉しく思います。

なんとお礼を申上げたら良いのか、言葉が見つかりません。
今まで数カ月悩んでいたことが、やっと解決できました。
本当にありがとうございました。
心からお礼を申し上げたいと思います。

またこちらでご質問させて頂くことがあるやも知れませんが、よろしくお願い致します。
それでは、失礼致します。

お礼日時:2001/12/09 04:46

sub hexenc{


my @ary, $dat;
@ary = unpack("C*", @_[0]);

$dat = '';
foreach(@ary){
$dat .= sprintf("%%%0.2x", $_);
}
return $dat;
}

を関数として

$data = hexenc("あいうえお");

とかやってみてください。
ダメだったらまた言ってください。
    • good
    • 0
この回答へのお礼

haporunさん、御回答ありがとうございます。
kokucho81さんが、新たにアドバイスして頂ける前に、いろいろと試してみたのですが、上手くいきませんでした。

ですが、回答して頂いただけでも嬉しく思います。
ありがとうございました。
これからもよろしくお願い致します。
では失礼します。

お礼日時:2001/12/09 04:29

いや~、教えてGOOに来るのも久しぶりだな~。



ひとつ回答して行くかな。
なになにですと?
ふむふむ。

エンコードは
$line =~ s/(\W)/'%'.unpack("H2",$1)/eg;
で$lineの中に入った文字列がエンコードできまするぞ。

CGIに合わせて改造しなされ。

なにかファイルをエンコードしたいということであれば、

while(<>) {
s/(\W)/'%'.unpack("H2",$1)/eg;
print;
}

としたファイルをconv.pl とでも名づけ、

「perl conv.pl エンコードしたいデータファイル名 > エンコードしたものを出力したいファイル名」

とすれば、しゃかしゃかエンコードしてくれますじゃろ。


ではでは、さらば。
    • good
    • 0
この回答へのお礼

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に書いてあることぐらいしか、いじれないので御教授して頂ければ、大変助かります。

何卒、よろしくお願い致します。
では、失礼します。

お礼日時:2001/12/08 03:56

このQ&Aに関連する人気のQ&A

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

このQ&Aと関連する良く見られている質問

Aベストアンサー

>画像ヘッダとはどういうものでしょうか?

Content-type: image/gif
Content-type: image/png
Content-type: image/jpeg

など、画像タイプごとに決まっています。
<img>タグに普通の画像ファイルが指定されている場合は
Webサーバが画像ファイルの拡張子から判断して返してくれ
ますが、CGIから返されるデータの種類は拡張子からは判断
できないのでCGI内部からヘッダを返す必要があります。


●CGIがPerlの場合で、GIF画像をCGIから返す例
#!/path/to/perl
print "Content-type: image/gif\n\n";
open(GIF, "file.gif");
binmode(GIF); binmode(STDOUT);
print <GIF>; close(GIF);

もちろん、CGIからは画像フォーマットを返せばいいので、
ファイルから読まずにあらかじめCGIソース内に画像データ
を持っておいて出力する方法も可能です。


ちなみに、多くのCGIではHTMLコンテンツを返す場合が多い
ので、ヘッダは以下のようになります。

print "Content-type: text/html\n\n";

>画像ヘッダとはどういうものでしょうか?

Content-type: image/gif
Content-type: image/png
Content-type: image/jpeg

など、画像タイプごとに決まっています。
<img>タグに普通の画像ファイルが指定されている場合は
Webサーバが画像ファイルの拡張子から判断して返してくれ
ますが、CGIから返されるデータの種類は拡張子からは判断
できないのでCGI内部からヘッダを返す必要があります。


●CGIがPerlの場合で、GIF画像をCGIから返す例
#!/path/to/perl
print "Content-type: image/gif\n\n...
続きを読む

QPerl/CGIでのエンコード方法

perlを使ってプログラムを書いています。
そこで困ったことが発生しております。
会員用CGIでフォーム上にIDとパスを入力するとログインできるプログラムです。
フォームにIDとパスを入力すると入室できますがログイン後、
http://www.*****.net/bbs.cgi?mode=check&ID=あゆ&PASS=0000
のようになったURLをクリックすると「ページが見つかりません」400エラーがでます。
IDが「あ」ではじまるものだけがこのような症状になります。
エンコード処理されていないからと思うのですが、これを正常な受け渡しをするにはどの辺りの場所にエンコード処理とデコード処理を書けばいいのでしょうか?
ただ、Aサーバーでは発生しないのにBサーバーでは発生します。サーバーにも依存するものでしょうか?
たいへん困っています。
お手数かけますが何卒宜しくお願いします

Aベストアンサー

> エンコード処理されていないからと思うのですが、これを正常な受け渡しをするにはどの辺りの場所にエンコード処理とデコード処理を書けばいいのでしょうか?

下記2つの処理を行う際にエンコード/デコードするのが一般的かと。
 URLへ値を渡す時(GETやURLリンクなど)
 URLから値を取得する時(GETなど)

URLへそのまま全角文字を渡すのは、
例え今は正常に動作したとしてもよろしくないです。あとあと苦労する可能性がありますので。
(別のシステムと相互運用するときとか)

Qperlの配列操作について、@array =~ s/AAA//g;を行いたい

perlの配列から、AAAを削除したい場合、どのようにすればよいでしょうか?
例えば、
@array = ('aAAAa','aa','bAAAa');
とある場合、
@array = ('aa','aa','ba');
としたい場合です。

イメージ的には、
@array =~ s/AAA//g;
としたいのですが、うまく動作しません。
ご存知の方教えていただけないでしょうか?
宜しくお願い致します。

Aベストアンサー

@array = map { s/AAA//g; $_; } @array;

Q/usr/local/bin/perl の発音

あまりにも初歩の質問かもしれませんが、
/usr/local/bin/perl
・・・を、声に出すとすると、
/ユーザー/ローカル/ビン/パール
・・・で、良いのでしょうか?

Aベストアンサー

新版 UNIX 由来/読み方辞書
http://x68000.q-e-d.net/~68user/unix/unix-term-dic.html

QUTF8 エンコード/デコード

http://oshiete.goo.ne.jp/qa/6746313.html


で質問した者です。
どうもお答え頂いたエンコードと、ブラウザ様が勝手に行うエンコードのルールが違うようです。

Perlは全てutf8、出力するHTMLもutf8、ブラウザ様が勝手にエンコードしたデータはなんですかあれ?

いろいろ試しましたが、なにをどうやっても文字化けします。

Aベストアンサー

昔作った検証用サンプルも入れときます
参考になれば幸いです

[ファイル名:index.cgi:UTF-8]↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#!/usr/bin/perl

my $sDT = '漢字です';
my $sDT_URL = './test.cgi?T1='.URL_Encode($sDT);

print <<HTML_BODY;
Content-type: text/html\n\n
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>TEST UTF-8</title>
</head>
<body>
<p><a href="$sDT_URL">CLICK</a></p>
</body>
</html>
HTML_BODY

exit;

## URLエンコード
sub URL_Encode{
my ($p01,@waste)=@_;
$p01 =~ s/([^\w])/'%'.unpack('H2',$1)/eg;
$p01 =~ tr/ /+/;
return $p01;
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


[ファイル名:test.cgi:UTF-8]↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#!/usr/bin/perl

my %hIN = readMethod();
my $ss = $hIN{T1};

print "Content-type: text/html\n\n";
print <<HTML_BODY;
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>TEST UTF-8</title>
</head>
<body>
送信内容:$ss
</body>
</html>
HTML_BODY

exit;

## ********************************************************
## メソッド読み込み
## ********************************************************
sub readMethod{
my %rm_in;
my $paramPost;
if($ENV{REQUEST_METHOD} eq 'GET'){
my @tmpPrmt = split(/&/,$ENV{'QUERY_STRING'});
foreach(@tmpPrmt){
my ($p1,$v1) = split(/=/,$_);
$v1 =~ tr/+/ /;
$v1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
if(exists($rm_in{$p1})){
$rm_in{$p1} .= "\t".$v1;
}else{
$rm_in{$p1}=$v1;
}
}
}elsif($ENV{REQUEST_METHOD} eq 'POST'){
read(STDIN, $paramPost, $ENV{'CONTENT_LENGTH'});
my @tmpData=split(/&/,$paramPost);
foreach(@tmpData){
my ($p1,$p2)=split(/=/,$_);
$p1 =~ tr/+/ /;
$p1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
$p2 =~ tr/+/ /;
$p2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
if(exists($rm_in{$p1})){
$rm_in{$p1} .= "\t".$p2;
}else{
$rm_in{$p1}=$p2;
}
}
}else{
print "die for error...";
}
return %rm_in;
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

昔作った検証用サンプルも入れときます
参考になれば幸いです

[ファイル名:index.cgi:UTF-8]↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#!/usr/bin/perl

my $sDT = '漢字です';
my $sDT_URL = './test.cgi?T1='.URL_Encode($sDT);

print <<HTML_BODY;
Content-type: text/html\n\n
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>TEST UTF-8</title>
</head>
<body>
<p><a href="$sDT_URL">CLICK</a></p>
</body>
</html>
HTML_B...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報