• ベストアンサー

"ー"を含むとサーバーエラーになる

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
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.1

"ー"はSJISでメタ文字"["を含むためのエラーのようです。 foreach中はむしろeucやutf8のような、問題を起こさない文字コードに変換して処理をさせ、printする直前でsjis等に戻してやるのが良いと思いますが、 それ以前にコードの書き方そのものが旧世紀の負の遺産らしいです。 以下のコードにするだけで片付くかもしれません。 #!/usr/bin/perl -T use strict; use warnings; use CGI; my $q = CGI->new(); my $name = $q->param('name'); my $value = $q->param('value'); print "$name\n"; print "$value\n"; 詳しくは参考URLをご覧下さい。

参考URL:
http://blog.livedoor.jp/dankogai/archives/50780781.html
umistu
質問者

お礼

ご回答ありがとう御座います。 色々と考えてみましたが、結局はEUC-JPのままで合わせることにしました。

その他の回答 (1)

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.2

No.1さんがおっしゃるように、EUC-JPかUTF-8で処理するのが一番スマートかと思い ます。 おそらく正規表現のところでエラーが出ているのだと思います。 まず、どこでエラーが出ているのかを以下の文を追加して特定してください。 use CGI::Carp qw(fatalsToBrowser); そして、エラーの出ている正規表現で、quotemataをするか、/\Q~\E/でメタ文字を 無効化してみてください。

umistu
質問者

お礼

ご回答ありがとう御座います。 quotemataはエラーはメタ文字無効化はでませんが、別の課題もありますので、EUC-JPに戻して処理することにしました。

関連するQ&A

  • 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
  • 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
  • 入力フォームからの半角カナを認識させたい

    入力フォームからの半角カナを全角に変換したいのですが、方法はありますでしょうか。 h2z_sjisを使ってみましたが、うまく行きませんでした。 foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); $FORM{$name} = $value; } <結果> アイウエオ(半角) → 渦慨オ よろしくお願いします。

    • ベストアンサー
    • 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
  • 掲示板を作りたい

    perlを勉強中です 掲示板に挑戦してみました 引用の文字色を変えたいと思っています。下記のように>>をいれるとその行の文字色を改行まで変えたいです >>引用文 しかし、やってみると、他の置換えがあってうまくいきません。 どうすればうまくいくのでしょうか? よろしくお願いします sub form_decode{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form, $ENV{'CONTENT_LENGTH'}); } else { $form = $ENV{'QUERY_STRING'}; $NG = 1; } @pairs = split(/&/,$form); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; $name =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; $value =~ s/>(&gt;[^<]*|>[^<]*)/&gt;&gt;<font color=\"red\">$1<\/font>/g; $value =~ s/>/&gt;/g; $value =~ s/</&lt;/g; $value =~ s/\r//g; $value =~ s/\n//g; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $FORM{$name} = $value; } }

    • ベストアンサー
    • Perl
  • Sendmailの文字化けについて

    以前にも同じ質問をしたのですが、いまいち解決していないので、もう一度質問させて頂きます。 ホームページでsendmailをつかってフォームより記入してもらった内容を自分のところと確認メールとして記入した人のところに送るようにしていますが、確認メールが文字化けすることがあるようです。 しかし、全ての人に対して化けるというわけではなく、ほとんどの場合は大丈夫なようですが、一部の人に対してだけ化けるようです。 関係しそうな部分を大まかに書くと下記のようにしておりますが、間違っているでしょうか? 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); $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $xx =$value; &trans; $value = $xx; } sub trans{ $from='[@01-9A-Za-z._-]'; $to='[@01-9A-Za-z._-]'; &jcode'convert(*xx, 'euc'); &jcode'convert(*from, 'euc'); &jcode'convert(*to, 'euc'); &jcode'tr(*xx, $from, $to); &jcode'convert(*xx, 'sjis'); } &jcode'convert(*message,'jis'); if (!open(MAIL,"|$sendmail $mail_address")) {&error;} &jis("Subject: $mailname"); print MAIL "$msg\n"; print MAIL "To: $mail_address\n"; print MAIL "From: $mailfrom\n"; print MAIL "\n"; print MAIL "$message"; close(MAIL); sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis');}

    • ベストアンサー
    • Perl
  • 半角カナを検出したい

    フォーム入力の半角カナを検出または全角に変換したいです。 ここで同じような質問をいくつかみて、いろいろ試しましたが どうもうまくいきません。 jcode.pl,v 2.6です。 デコード部分は以下のようになってます。 #!/usr/bin/perl require 'jcode.pl'; print "Content-type: text/html\n\n"; $request_method=$ENV{'REQUEST_METHOD'}; if($request_method eq "POST"){ read(STDIN,$query_string,$ENV{'CONTENT_LENGTH'}); }else{ $query_string=$ENV{'QUERY_STRING'}; } @pairs=split(/&/,$query_string); foreach $pair(@pairs){ ($key,$value)=split(/=/,$pair); $key=~ tr/+/ /; $key=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*key,'sjis'); $key=~ tr/,/_/; $value=~ tr/+/ /; $value=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*value,'sjis'); $value=~ tr/,/_/; $input{$key}=$value; } よろしくお願いします。

    • ベストアンサー
    • Perl
  • 半角カタカナ→全角カタカナ変換がうまくいきません。

    お世話になっております。 フォームから入力された文字を、 「半角カタカナ→全角カタカナ」変換したいのですがうまくいきません。 コーディングは以下の通りですが、問題の箇所がわかりません。 どなたかご教授ください。 なお、jcode.plは、最新のものを使っています。 #↓=============================================== ##### フォームデータ受け取り if ($ENV{'REQUEST_METHOD'} eq 'POST') {  read( STDIN , $buffer , $ENV{'CONTENT_LENGTH'} ); } else {  $buffer = $ENV{'QUERY_STRING'}; } # 文字コードを正確に取得するために,全ての送信データをいったん文字コードチェックする $buffer1 = $buffer; $buffer1 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $kcode = &jcode::getcode(*buffer1); @pairs = split(/&/ , $buffer); ##### フォームデータのデコード、漢字コードをsjisに変換 foreach $pair (@pairs) {  ($k,$v) = split(/=/,$pair);  $v =~ tr/+/ /;  $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  &jcode'convert(*v,"sjis",$kcode);  # 半角カナを全角に変換  if($kcode eq 'sjis') {   &jcode::h2z_sjis(\$v);  }  if($kcode eq 'euc') {   &jcode::h2z_euc(\$v);  }  if($kcode eq 'jis') {   &jcode::h2z_jis(\$v);  }  $in{$k} = $v; } #↑=============================================== (なお、全角スペースは、半角スペースなどに変更願います。) よろしくお願いします。

  • 「繝・せ繝・」となる文字化け

    「テスト」を以下でデコードすると「繝・せ繝・」となってしまいます。 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

専門家に質問してみよう