フォームデータの読み込みについて

このQ&Aのポイント
  • 現在CGIでデータベースを作成しています。データはCSVで保存し、検索するとCSVのデータを読み込むようになっています。
  • 基本的に検索は問題なくできるのですが、「Ö,Ä,Å」を含む情報を大文字で検索した場合に値を求めない問題が生じています。小文字の「ö,ä,å」を含む情報は問題なく検索できます。
  • フォームデータのデコードに問題があるのでしょうか?
回答を見る
  • ベストアンサー

フォームデータの読み込みについて

こんにちは。CGI初心者のものです。下記の事例について詳しい方やアドバイスができる方がおられましたら、ご指導いただければ幸いです。 現在CGIでデータベースを作成しています。データはCSVで保存し、検索するとCSVのデータを読み込むようになっています。英語以外の文字を検索することもあるのでUTF-8を文字コードとして用いています。 基本的に検索は問題なくできるのですが、「Ö,Ä,Å」を含む情報を大文字で検索した場合に値を求めない問題が生じています。小文字の「ö,ä,å」を含む情報は問題なく検索できます。 置換演算子(i)で大文字と小文字の区別をなくしているのですが、どうして大文字の場合読み込めないのかわかりません。 フォームデータのデコードに問題があるのでしょうか? 現在は、下記のような処理を行なっています。 sub get_formdata{ local($buffer,@pairs,%FORM,$name,$value); if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach (@pairs) { ($name, $value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; 詳しい方がおられましたら、この問題の解決策を教えてください。お手数をおかけしますが、宜しくお願いいたします。

  • Perl
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

読み込むとき、というかPerlが実行されているときの環境です。 perlre というドキュメントを見ると i Do case-insensitive pattern matching. If "use locale" is in effect, the case map is taken from the current locale. See perllocale. とありますから、通常はアクセント記号つき文字は大小文字無視の対象になりません。 で、localeを有効にするには use localeすればよいです。 NAME locale - Perl pragma to use and avoid POSIX locales for built-in operations SYNOPSIS @x = sort @y; # ASCII sorting order { use locale; @x = sort @y; # Locale-defined sorting order } @x = sort @y; # ASCII sorting order again DESCRIPTION This pragma tells the compiler to enable (or disable) the use of POSIX locales for built-in operations (LC_CTYPE for regular expressions, and LC_COLLATE for string comparison). Each "use locale" or "no locale" affects statements to the end of the enclosing BLOCK. See perllocale for more detailed information on how Perl supports locales. もし環境変数とは関係なく設定したいのなら、perllocale にあるように # Import locale-handling tool set from POSIX module. # This example uses: setlocale -- the function call # LC_CTYPE -- explained below use POSIX qw(locale_h); # query and save the old locale $old_locale = setlocale(LC_CTYPE); setlocale(LC_CTYPE, "fr_CA.ISO8859-1"); # LC_CTYPE now in locale "French, Canada, codeset ISO 8859-1" setlocale(LC_CTYPE, ""); # LC_CTYPE now reset to default defined by LC_ALL/LC_CTYPE/LANG # environment variables. See below for documentation. のようにします。 とはいえ自分では use localeしたことってほとんどないので 実際にどうなるかはよくわかりません。 ドキュメントを読む限りではそれでいいと思うのですが。

goju_FFF
質問者

お礼

ご助言有難うございました。 やはりロケールの問題でしたね。 もう少しuse localeを勉強してから 問題を解決して以降と思います。 言語問題は厄介ですね。 では、重ねてご返答有難うございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

カギカッコ内の文字が化けてます。 たぶん、ローマ数字か何かだと思うのですがどうですか? /i で大小文字を無視するのは、基本的にラテンアルファベットだけです。 #アクセント記号の文字はどうだったか自信がない

goju_FFF
質問者

補足

失礼しました。また、ご返答有難うございました。 文字化けしていたのはウムラウト文字です。 o,aにウムラウトがついたものです。 これは、フォームデータの読み込みの際のロケールと 関連がある問題ですか? よろしかったら教えてください。

関連するQ&A

  • UTF-8から送信されたデータを日本語化するには?

    %E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A これを あいうえお に変換するには、どのようにデコードすればいいのでしょうか? ご教授お願いします。m(_ _)m [現在のソース] $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; my $value = Jcode::convert($value, 'utf8'); $FORM{$name} = $value; } ↓ 「縺ゅ>縺・∴縺・」が検出されます。

    • ベストアンサー
    • Perl
  • Jcode.plを使用してコンバート

    if($ENV{\'QUERY_STRING\'} eq \"\"){ read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'}); }else{ $buffer = $ENV{\'QUERY_STRING\'}; } @pairs = split(\'&\',$buffer); foreach $pair (@pairs) { ($name, $value) = split(\'=\', $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(\"C\", hex($1))/eg; &jcode::convert(\\$value,\'sjis\'); $form_data{$name} = $value; } Getメソッドで文字「?a=あ」をperlのJcode.plを使用してコンバートしましたが、 ブラウザのURL表示部は「?a=%82%A0」となり、shift_jisの16進数表示されてしまいます。 クッキーに取り込んで表示しても??と表示されてしまいます。 何かしら変換しているみたいのですが、 変換方法はあってるのでしょうか?

    • ベストアンサー
    • Perl
  • safariで買い物かごに残らない

    ある買い物カゴCGIを使用していますがsafariだと日本語表記の商品だけ買い物カゴに入れても残りません。 次の買い物をしたり買い物カゴを確認した時に入っていません。英数表記の商品は大丈夫です。 CGIそのものが古いので替えるのがベストなんですが、諸事情により当面これを使用しなければいけないので何とか御教授お願い致します。 多分下記の部分が問題だと思うのですがCGIなどは全くの素人なので分かりやすくお願い致します。 *********************************************************** if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 記録するデータはsjisに統一する &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/://g; $value =~ s/,//g; $FORM{$name} = $value; } $soryo = $FORM{$soryo}; #--------# $cookies = $ENV{'HTTP_COOKIE'}; @cookie_pairs = split(/;/,$cookies); foreach $cookie_pair (@cookie_pairs) { ($name, $value) = split(/=/, $cookie_pair); $name =~ s/ //g; $DUMMY{$name} = $value; } $goods_next = 0; foreach $goods_num (1 .. $#cookie_pairs + 1) { $cookie_name = 'CARGO_'.$goods_num; if ($DUMMY{$cookie_name} =~ /^goods:/ || $DUMMY{$cookie_name} =~ /^removed/) { $GOODS[$goods_num] = $DUMMY{$cookie_name}; $goods_next = $goods_num + 1; } } #--------# ***********************************************************

    • ベストアンサー
    • CGI
  • チェックボックスからの値を受け取る

    つたなくもperlを使ってCGIスクリプトを作っている者です。 <input type="checkbox" name="test" value="1">1 <input type="checkbox" name="test" value="2">2 <input type="checkbox" name="test" value="3">3 上記のように、nameは全て同じ名前にして、データを受け取りたいと思っています。 ただ、 if($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{CONTENT_LENGTH}); } require './jcode.pl'; @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コードをS-JIS変換 &jcode'convert(*value, "sjis", "", "z"); $data{$name} = "$value"; と、最初に$data{test}に格納をしています。 現在は全ての項目にチェックをいれても、 3 と表示されてしまいます。 なんとかjcode.lib以外のモジュールを使わないで、 $data{test}に選択された全ての項目を入れることはできないでしょうか。 ご教授いただけましたら幸いです。

    • ベストアンサー
    • Perl
  • "ー"を含むとサーバーエラーになる

    HTMLのShift_JISに合わせて、Jcode.plで日本語コード変換のeucをsjisに変更したのですが、"ー"が$FORM{'key'}に含むとサーバーエラーになります。 どうしたら、sjisで"ー"など一部文字でエラーなく処理できるのでしょうか? アドバイスお願い致します。 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $name2 = $name; $value2 = $value; $FORM2{$name} = $value; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); #←ここを変更

    • ベストアンサー
    • CGI
  • デコード処理について

    sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } while (($k,$v) = each %in) { $v =~ s/&/&amp;/g; $v =~ s/</&lt;/g; $v =~ s/>/&gt;/g; $v =~ s/"/&quot;/g; $in{$k} = $v; } } 上記の処理が、具体的にどうなっているのかよくわかりません。 どなたか分かる方、説明をお願いします。

  • GETのうけとり。

    http://127.0.0.1/test2.cgi?jikanst=0&jikanend=24&youbi=0&rinji=0 以上のデータを、取得したいのですが、参文献の通りのつもりなのですが、「サーバーが見つからないか、DNS エラーです。」という表示がでてきます。なぜでしょうか? よろしくお願いします。 #!/usr/bin/perl $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $form{$key} = $value; } $jikanst = $form{'jikanst'}; $jikanend = $form{'jikanend'}; $youbi = $form{'youbi'}; $rinji = $form{'rinji'}; print "Content-type: text/html"; print "$jikanst,$jikanend,$youbi,$rinji";

    • ベストアンサー
    • Perl
  • 「繝・せ繝・」となる文字化け

    「テスト」を以下でデコードすると「繝・せ繝・」となってしまいます。 URL test.cgi/q_テスト/ $ENV{'PATH_INFO'}と「q_テスト」を使うことを前提として、「テスト」と正常に取る方法はありますでしょうか。 ご教授お願いします。 $buffer = $ENV{'PATH_INFO'}; $buffer = substr($buffer,1); @lens = split(/\//,$buffer); foreach $len(@lens){ ($name, $value) = split(/_/,$len,2); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/\t/ /g; $value =~ s/\n//g; $FORM{$name} = $value; }

    • ベストアンサー
    • Perl
  • FLASHとCGIでのデータの受け渡しについて

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=602714 でも質問をしたのですが、 FLASHとCGIのデータ受け渡しについて質問です。 FLASH側でテキスト入力したものをCGIで受信して表示を、と思ってるのですが、 イマイチうまくいきません。 FLASHのcgi実行ボタンのアクションスクリプトは on(press){ this.getURL("http://***/test.cgi","NAKA","POST"); } test.cgiの中身は read(STDIN,$buffer,$ENV{'content_length'}); ($title,$value)=split(/=/,$buffer); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print "Content-type:text/html\n\n"; print "<FONT COLOR=RED>文字列</FONT><BR>\n"; print "$buffer<BR>\n"; なんてしてみましたが、「文字列」だけきちんと表示されて後は文字化けしてます。 (変換がうまくいってないのかな?) このデータの受け渡しはあってるのでしょうか?間違ってるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • 掲示板の上部と下部にHTML枠を設けたい

    掲示板の上部と下部にHTML枠を設けたいのですが 下記で正解でしょうか?詳しい方、ご教示お願いします。 フォームより内容保存 掲示板にHTML出力 ブラウザーからデーターを送る部分(フォーム) <form action="bbs.cgi" method=POST> □上部表示部分<br> <textarea name=upper rows=5 style="width:99%;"></textarea> <br> <br> □下部表示部分<br> <textarea name=lower rows=5 style="width:99%;"></textarea> <input type=submit value="編集内容を保存"> </form> ##------------------------------------------------------------ # データがPOST形式 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); # データを name 別に分割する @pairs = split(/&/, $buffer); # データハッシュ形式に変換する(%FORM) foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; # 文字の処理 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'euc'); $FORM{$name} = $value; }

専門家に質問してみよう