最近cgiを始めたばかりの者です。
HTMLでフォームを作り、

FORM action="view.cgi"method="GET"

でcgiに渡すようにしました。
CGIで受け取った文字に全角があると
%83%8B%83i%83e%83B%83N%83X
のような文字化けをします。
調べてみたところjcode.plを使えば
文字化けを回避できるようですがうまく
いきませんでした。

質問1.jcode.plを読み込ませるのは
上記のview.cgiで良いのでしょうか。

質問2.require "jcode.pl";といれた後
具体的にどのように受け取ったデータを
jcodeに渡せばいいのでしょうか?
@data = split(/&/,$ENV{QUERY_STRING});
で@dataに受け取った情報を渡しています。

ご教授頂ければと思います。
よろしくお願いします。

A 回答 (1件)

いいえ。


これは文字化けではなく、ブラウザがURIエンコードして送ってきた状態のものです。
このままの状態でjcode.plに通しても、
%83%8B%83i%83e%83B%83N%83X
のままです。
なぜなら、jcode.plから見れば、「『%83%8B%83i%83e%83B%83N%83X』という文字列が来た」と解釈するだけだからです。
元の日本語に戻したい場合は、エンコードの反対、つまりデコードすればいいことになります。

デコードには以下の文を使います。

$hoge =~ tr/+/ /;
$hoge =~ s/%([a-fA-F0-9]{2})/pack('H2',$1)/eg;

そして、QUERY_STRINGの値に対して行う場合の例を以下に示します。

foreach $pair (split(/&/,$ENV{'QUERY_STRING'})){
($name,$value) = split(/=/,$pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9]{2})/pack('H2',$1)/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9]{2})/pack('H2',$1)/eg;
$FORM{$name} = $value;
}

これで連想配列(別名「ハッシュ」)FORMに各項目($name)ごとに対になる値($value)が代入されます。

jcode.plはどこで使うのかというと、デコードした後、その全角文字の文字コードをプログラム内で使う上で統一するために使います。
通常、EUC-JPでブラウザに表示していてフォームで送った場合は、ブラウザもEUC-JPの状態でエンコードしたものを送ってくれます。
しかしながら、条件やブラウザのバグ等によってはそうでない場合(ShiftJISだったり等)もありえます。
こんな時に、jcode.plを使うのです。
ちなみに使う時は、
連想配列に代入する前に、
&jcode::convert(\$value,'euc');
というように挿入して使います。(EUC-JPにしたい場合の例)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
無事解決することができました。

具体例もしめしていただき大変助かりました。
これでようやく先に進めます。
ありがとうございました。

お礼日時:2005/04/18 21:55

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


人気Q&Aランキング