WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:URLデコーディング

0:[投稿] @(--)? [MAIL] [2002/07/17 20:57 ][環境:UNIX系+IE UNIX系+Perl]

初めて投稿致します。
皆様のお力を必要としています。
何卒、宜しくお願いします。

【内容】
 Perlを使用して、サーブレットを作成しています。
 ブラウザからURLエンコーディング(EUC)された日本語文字列を
 取得し、その内容をファイルに落とす処理を作成しています。
 ブラウザから取得した文字列をURLデコーディングしたいので
 すが、巧く行きません!
 以下に、現状のプログラムを記述します。

 【プログラム】
  $query = $ENV{'QUERY_STRING'} ;
  $query =~ s/\+/ /g ;
  $query =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex($1))/eg ;
# ([0-9a-F][0a-fA-F])も試しましたが、出来ませんでした。
  @pairs = split (/&/, $query);
  foreach $pair (@pairs) {
   ($key, $value) = split (/=/, $pair);
   $form_data{$key} = $value;
  }
  $syo = $form_data{"syo"};
  $syo2 = $form_data{"syo2"};

  open(FH, ">>log.log") ;
       print FH "start \n" ;
       print FH $query ;
       print FH "\n" ;
       print FH $syo ;
       print FH "\n" ;
       print FH $syo2 ;
       print FH "\n" ;
       print FH "ends \n" ;
  close(FH);

exit() ;

 【補足】
  ブラウザからは、EUCでエンコーディングした文字列を
  送っています。


1:[回答] J [2002/07/18 09:16 ]

GETのデータしか受け取ってないですが、
POSTで送ってるとか?


2:[回答] @(--)? [2002/07/18 11:47 ]

Jさん、回答ありがとうございました。m(_ _)m

POST処理を入れて対応してみましたが、まだ、巧く行きません
でした。

もう少し、詳細に現象を明記しますので、宜しくお願い致します。
【現象】
 ブラウザ:
      ブラウザから送っているパラメータの内容は以下の
      通りです。

      ?syo=%B2%CF%CC%EE&syo2=%A4%E8%A4%A4%BB%D2%0D%0A%A4%C7%A4%B9
      syo :%B2%CF%CC%EE:”河野”
      syo2 :=%A4%E8%A4%A4%BB%D2%0D%0A%A4%C7%A4%B9 :”良い子
  です”
      ※:パラメータは、EUCのエンコーディングです。
        syo2には、改行が含まれています。

 Perl:
    log.logに書かれている内容は、下記の通りです。
    デコーディングして、ファイルに内容を書きたいのですが
    文字化けが起きてしまいます。


    【log.log】
     start
     syo=\262\317\314\356&syo2=\244\350\244\244\273\322^M
     \244\307\244\271
     \262\317\314\356
     \244\350\244\244\273\322^M
     \244\307\244\271
     ends

ブラウザから送付しているエンコーディング文字がEUCでは無いのでしょうか?
それとも、Perlでデコーディングしている処理に問題が有るのでしょうか?
また、何か他に問題が有るのでしょうか?

皆様のお力を貸して下さい。
宜しくお願いします。


3:[回答] J [2002/07/18 13:32 ]

自分もよくわからんですが・・・
改行のところに^Mがついてるから
sjisで送られてるんじゃないですかね?


4:[完了] @(--)? [2002/07/18 14:47 ]

J殿へ
お疲れ様でした。
今まで、お付き合いして頂き誠にありがとございました。
m(_ _)m

何とか、出来る様になりました。
以下に、要因と私がバカだった事を書いておきます。

【私バカよね〜】
 1)「^M」について
   クライアント側のEUCエンコーディング変換で、改行を
   0x0D0Aから0x0Aに変換する事が抜けていました。

 2)EUCデコーディングが出来ない理由
   [a-fA-F0-9][a-fA-F0-9]指定で行えば、出来ました。

 3)ファイルの内容が文字化けしている理由
   UNIXの環境設定が間違っていました。
   その為、漢字コード(全角文字)が化けていました。
   何で、今まで気が付かなかったんだろう!!

(^^)v:Bye-Bye


5:[完了] ふじ [URL] [2002/07/18 15:08 ]

ちょっとまった。

>>4 の 2)は、

> $query = $ENV{'QUERY_STRING'} ;
> $query =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex($1))/eg ;

これを、

$query = $ENV{'QUERY_STRING'} ;
$query =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack ("C", hex($1))/eg ;

こうしたらデコードできた、という意味ですか?
& と = で分解する前にデコードしてしまうと、データに & や = が
(エンコードされて)含まれている場合に、困ったことになります。
& と = でばらしてから、各要素についてデコードしなくては。

というか、なんで CGI.pm を使わないのでしょう?
同様の処理は、

use CGI;
$q = CGI->new;

$syo = $q->param("syo");
$syo2 = $q->param("syo2");

だけでできますよ。
# 勉強のために自分で一から書いている、ということでなければ
# モジュール使ったほうがいいと思う。


6:[完了] @(--)? [2002/07/18 15:38 ]

待ちました!!
初めまして、ふじ殿

確かに、言われた通りに作ってみれば、デコードを気にしないで
パラメータが取得出来ました。
有難うごさいました。

皆様のご協力に感謝致します。m(_ _)m

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World