CGI-BBS > 基礎 > jcode/jcode.pl > 日本語データをエンコーディングしたい。


カレッヂ
カレッヂ


質問者 宇宙のステルヴィア  投稿日 8/23(土) 02:30:45
ログファイルから読み取ったデータの名前にリンクを設け、
そこをクリックするとそのデータについて詳しい情報が表示された画面に
切り替えられる仕掛けが作りたいのです。

データ名一覧
  ▼
一覧中のデータ名1つをクリック(画面A)
  ▼
データ名についての詳しい情報を表示(画面B)

画面Aから画面Bにデータを渡すときGETでデータを渡すわけで、
ログファイルから読み取られた日本語データ(例・あいいうえお)を
$setumeiに代入されているとしたら、
画面Bへのリンクのアドレスはスクリプトでは次のようになります。
リストA
http://www.・・・・com.jp/XXX.cgi?mode=a&COM=$setumei

でも、上記のままだと実行後
リストB
http://www.・・・・com.jp/XXX.cgi?mode=a&COM=あいうえおかきくけこ…

となります。
しかし、これを受け取った方ではどうしても文字化けが発生してしまいます。
したがって、リストAの日本語データ「$setumei」をエンコーディングして、
画面Bでデコードし表示させたいわけです。
でも、エンコードなんて経験は無いと同時に本にもくわしい方法が載っていません。
リストAに付け加えるものとかあるでしょうか?

仕事も絡んでいるため早い解決方法がわかるようお願いします。
こちらでも努力しますので。

プロバイダ参照:http://www.mirai.comm.to/
サーバのOS:WINサーバ
パソコンのOS:Win95系
エディタ:Trepad
FTPソフト:FTTP
サーバ移転:していない
改造:していない
CGI習熟度:advanced

回答者 まさ  [削除]  投稿日 8/23(土) 21:44:08
ようは受け取る方の問題ですね。
現在どうやってそのデータを受け取っていますか?

CGI.pmを使えば全く問題なくデータを受け取ることができますよ。

use CGI;
$q = new CGI;
my $COM = $q->param('COM');

CGI.pmを使えばこれでデータを受け取れます。

質問者 宇宙のステルヴィア  [削除]  投稿日 8/25(月) 01:26:03
データの受け取り方?と申しますと
ログファイルから読みこんだデータを、
スクリプト本体が実行する段階にあたることでしょうか?

ループ文でログファイルの最後まで1行ずつ呼んで行き、
実行するようにしています。

foreach ( @NEW ) {
	($name,…,$setumei) = split(/\<\>/,$_);
		・
	print "<a>http://www.・・・・com.jp/XXX.cgi?mode=a&COM=$setumei>開設を見る</a>\n";
		・
}

ところで拡張子の「.pm」とは?
今のスクリプトの拡張子「.cgi」を「.pm」に変更すると言うことなのですか?
回答者 まさ  [削除]  投稿日 8/25(月) 09:52:05
>foreach ( @NEW ) {
>	($name,…,$setumei) = split(/\<\>/,$_);
>		・
>	print "<a>http://www.・・・・com.jp/XXX.cgi?mode=a&COM=$setumei>開設を見る</a>\n";
>		・
>}

この部分と言うのはリンクデータを生成しているところですよね。

ここではなくてこのリンクが押されたら実行される部分です。
つまりmode=aの場合実行されるサブルーチンとでも申しましょうか。
その中で「COM」の受け取り処理をしている筈なので、わたしが知りたいのはその部分
をどうやって処理しているかです。
よく$FORM{'COM'}とかなっているのを見かけますが、それをどうしているかです。

わたしが示したコードは一般的な$FORM{'foo'}でデコードするのではなく、CGI.pmと
言うモジュールで処理する場合です。

>ところで拡張子の「.pm」とは?
>今のスクリプトの拡張子「.cgi」を「.pm」に変更すると言うことなのですか?

拡張子が「.pm」となっているのは、モジュールと言うひとつのパッケージです。
これはPerl5以上からそうなりました。それまでは「.pl」と言うのが一般的でした。
例えば「jcode.pl」とか。

ですから「jcode.pl」などは過去の遺産です。新規スクリプトを書く場合、できるだけ
使わない方がいいでしょう。「jcode.pl」の代わりのモジュールは「Jcode.pm」です。

で「CGI.pm」ですが、これはPerl5の標準モジュールなので、Perl5以上なら基本的に
何もしなくても使えます。

これを使うとファイルのアップロードなど恐ろしく簡単になります。
このモジュールはデコード処理も自動でやってくれるので以前のように自分で
$FORM{'foo'}みたいなものを書かなくてすみます。

スクリプトの頭に

use CGI;
$q = new CGI;

と書いて、あとはデコードしたい部分に

my $COM = $q->param('COM');

と書くだけです。これだけで自動で文字コードを判別して、デコードしてくれます。
これだと質問のような文字化けがありません。

質問者 宇宙のステルヴィア  [削除]  投稿日 8/25(月) 11:35:46
データを受け取る段階がわかりましたが、

受け取る方法は
表示するサブルーチンでIN{COM}という形で受け取り表示させるようなっています。

Jcode.pmを使用するとエンコーディングの必要が省けると言うわけですね。
と言うことはアドレス中に直接日本語が入ったままだと思います。
良くサーチエンジンで見かける下のような形にしたいです。

E6%A4%9C%E7%B4%A2&l

私のわがままですがこのほうがインターナショナルのような気がするので…


Jcode.pmはJcode.plの後継者でかなり優れていると前から耳にしていました。
でも入手先が不明です。「ここからどうぞ」と表示されてても
JcodeフォルダのなかにJcode.pm見つかりませんでした。
いったいどこに…。
回答者 まさ  [削除]  投稿日 8/25(月) 13:33:20
ようは見た目にエンコードされている方がいいと言う訳です。

エンコードは

$str = 'あいうえお';
$str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;

これで$strは
%82%a0%82%a2%82%a4%82%a6%82%a8
になります。

デコードは

$str = '%82%a0%82%a2%82%a4%82%a6%82%a8';
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;

これで$strは
あいうえお
になります。

こういう事でしょうか?

ちなみにモジュールはCPANという所で管理されています。
もちろんJcode.pmも

http://search.cpan.org/author/DANKOGAI/Jcode-0.83/

質問者 宇宙のステルヴィア  [削除]  投稿日 8/25(月) 15:19:44
$setumei =~ s/(\W)/'%'.unpack("H2", $1)/ego; ←追加
print "<a>http://www.・・・・com.jp/XXX.cgi?mode=a&COM=$setumei>開設を見る</a>\n";

print 文の手前に $setumei =~ s/(\W)/'%'.unpack("H2", $1)/ego; を追加した結果、
日本語データをエンコーディングすることに成功しました。
デコード処理サブはあらかじめ存在していたので書き加える必要はありませんでした。

Jcode.pm も入手に成功しました。
Jcode.pm は必要になりましたら改めて詳しい使い方を質問をさせていただきます。
今回協力ありがとうございました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技