utf8使用時のフォーム入力文字コードについて

このQ&Aのポイント
  • utf8使用時のフォーム入力文字コードについての調査結果をまとめました。
  • binmode(STDIN,":encoding(shiftjis)"というコードは、入力時に内部変換を行い、UTF-8として扱えるようにするためのものです。
  • 現在は自前でUTF-8に変換するコードを使用しています。
回答を見る
  • ベストアンサー

utf8使用時のフォーム入力文字コード

use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

  • dany
  • お礼率69% (29/42)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

このソースで問題なのはbinmodeではなくuse open...の箇所です。 use open 'encoding(utf8)'; は、入出力をUTF-8とするプラグマですが、 これはこの後から開くファイルハンドルに有効です。 すなわちこの時点で既に開かれているSTDIN,STDOUT,STDERRはUTF-8にならず、 プラットフォームデフォルトのエンコードのままになります(この場合はShift-JIS)。 標準入力/出力/エラーの3つをUTF-8エンコードにバインドしたい場合は、use openの後で use open ":std"; と記述すれば大丈夫です。 この後でbinmodeしても、STDINはちゃんとShift-JISとして扱われます。

参考URL:
http://www.pure.ne.jp/~learner/program/Perl_unicode.html#perlio
dany
質問者

お礼

ありがとうございます。 読みつついろいろ実験してみたのですが、どうも自分が 求めているのとは違うものみたいでした。^^; 標準入力のSJISを勝手にUTF-8に変換してくれるのかとか、 そんなようなものを期待していたのですが。

関連するQ&A

  • HTTP::Request::Common qw(POST);時にソフト表だとエラーになる

    お世話になります。 HTTP::Request::Common qw(POST);を使ってPOSTする際、aaa=> 'あいう',などの日本語はPOST後、データが渡っている事が確認できるのですが、'ソフト表'等の文字列をあえて送ろうとすると、エラーになってしまいます。 記述はShift_JISで行っています。 先生方、ご教授ねがえませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use HTTP::Request::Common qw(POST); use LWP::UserAgent; #use open IN => ":utf8"; # 入力をUTF8とする #use open OUT => ":shiftjis"; #use open ":std"; #use Encode; use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'shiftjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #use open ":encoding(shiftjis)"; #require './jcode.pl'; my $ua = LWP::UserAgent->new; #タイムアウトを設定 $ua->timeout(10); my $req1 = POST 'http://domain.com/test.cgi', [ aaa => 'www1', bbb => "ソフト表" ,#bbb=> 'あいう',だとエラーになりません ]; print $ua->request($req1)->as_string;

    • ベストアンサー
    • Perl
  • Cannot decode string with wide characters

    use utf8; binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; use strict; use Encode; sub main(){ #UTF-8(BOMなし),CRLFのファイルに書いてます。 my $str = "あ"; my $bin = $str; $bin = Encode::encode('euc-jp', Encode::decode('utf8', $str)); $bin = Encode::encode('utf8', Encode::decode('euc-jp', $bin)); print "Content-Type:text/plain;charset=UTF-8\n"; print "\n"; print $bin; } &main; ======================= 希望する出力結果: あ ============================ 結果:Internal Server Error Apacheのエラーログ: [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] Premature end of script headers: 20080109-1.pl [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] at C:/Environment/Perl/v5.8.8/lib/Encode.pm line 166.\r ========================= 質問: どのように修正すればよいか?

  • Data::Dumper;でダンプ後表示した文字列\x{30fc}...

    お世話になります。 下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか 表示時に日本語の所が\x{30fc}のような文字列になってしまいます。 これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。 どなたかご教授いただけませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use XML::RSS; use Data::Dumper; my $rss = new XML::RSS; #表示形式の違いで1と2がある。 $Data::Dumper::Indent = 1; use open IN => ":utf8"; # 入力をUTF8とする use open OUT => ":shiftjis"; #use open ":std"; #use Encode; #use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #binmode STDOUT, ":encoding(euc-jp)"; #use open ":encoding(shiftjis)"; # rssをセット。 open my $fh, '< ./test.rss'; my $text = join undef, <$fh>; close $fh; # rssをパース $rss->parse($text); # ひとまず中見を知る為にダンプしてみる print "Content-type:text/html;charset=Shift_JIS\n\n"; print "<html><head>\n"; print "<title></title></head>\n"; print "<body>\n"; print Data::Dumper->Dump([$rss]);

    • ベストアンサー
    • Perl
  • Encode と encoding の同時使用で ISO-2022-JP に encode できない

    CentOS を 5.1 から 5.2 にアップデートした頃から PerlCGI からのメール送信が出来なくなって、調べていたら「ISO-2022-JP への encode がおかいぞ問題」に辿り着きました。 以下のコードで、euc-jp が吐かれてしまいます。 #! /usr/bin/perl -w use encoding('UTF8'); use Encode; binmode(STDOUT); my $text = "<全角文字ですよぉ。>"; print encode('ISO-2022-JP', $text), "\n"; 以下のいずれかで正常に jisコードを吐く様になるのですが、こんなものなんでしょうか? 1 「use encoding('UTF8');」 を 「use utf8;」に替える 2 print の直前に "no encoding;" を入れる CentOS 5.1 では多分正常に ISO-2022-JP への変換ができていたのだと思います。 私の使用するバージョンの Cygwin の Perl でも正常です。 問題のある CentOS5.2 と 問題の無い Cygwin版で、関係しそうなバージョンの違いはありません。 CentOS 5.2: Perl 5.008008 Encode 2.12 Encode::JP 2.01 encoding 2.02 Cygwin: CYGWIN_NT-5.1 **** 1.5.25(0.156/4/2) 2008-04-17 12:11 i686 Cygwin Perl 5.008008 Encode 2.12 Encode::JP 2.01 encoding 2.02 できれば、すでに動いているCGIの use encoding('UTF8'); を直す事なく動く様にしたいのです。

  • 標準入力からのutf-8→euc-jpで一部文字化け

    これまでeuc-jpで作られていたHTMLフォームページをutf-8に変更したところ、フォームメールCGIの文字列処理で「~」「-」「 」(半角スペース)など一部の文字が文字化けするようになってしまいました。 Jcode.pm → Encodeに変更してみても症状は変わりませんでした。 Encodeは初めて使うのですが、過去ログを見てもよく分かりません・・・ どうぞお力添えをお願いします。 (1)下記のperlの記述方法で間違っている箇所はありますか? (2)正しく出力できる方法がありましたら、教えてください。 (3)http://oshiete1.goo.ne.jp/kotaeru.php3?q=1540626 で話されている、右側の折れ曲がった「~」はどうやって入力するのでしょうか? (3)perl側もutf-8で記述すれば、文字化けなど発生せずに処理出来るものなのでしょうか? ↓perl5.8 文字コードeuc-jp #!/usr/bin/perl use Encode;#### if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) { binmode(STDIN); read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @data_s = split(/&/,$buffer); foreach $buffer (@data_s) { ($key,$value) = split(/=/,$buffer); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg; $value = encode("euc-jp", $value);#### print "$key = $value\n"; } }

    • ベストアンサー
    • Perl
  • utf-8環境で標準入力からの全角文字にマッチさせる方法

    utf-8でフォーム処理のコードを書いてます。 euc-jpで動作していた全角文字の正規表現がutf-8で動作しません。 単純な「$str =~ /あ/」のような書き方ではなく、別な指定方法が必要なのでしょうか? ・perl5.8 文字コードutf-8 標準入力側文字コードutf-8 use utf8; my(%POST,$buffer,$key,$value,@data_s); if ($ENV{'REQUEST_METHOD'} eq 'POST') { if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) { binmode STDIN; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @data_s = split(/&/,$buffer); foreach $buffer (@data_s) { ($key,$value) = split(/=/,$buffer); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg; if ( exists ($POST{$key}) ) { $POST{$key} .= '<>' . $value; } else { $POST{$key} = $value; } } } } binmode STDOUT,":encoding(utf8)"; print "Content-type: text/html; charset=utf-8\n\n"; print "<br>\n"; foreach $key (keys %POST) { if ($POST{$key} =~ /[0-9]/) { print "全角数字にマッチ<br>\n"; }###### print "$key = $POST{$key}<br>\n"; } exit;

    • ベストアンサー
    • Perl
  • Perlの文字コード変換についての質問です。

    Perlの文字コード変換についての質問です。 ホームページ全体は、UTF-8で作成されています。 そのため、$qsは、どうも、S-JISのようなので、UTF-8に変換して URLデコードさせたいのですがうまくいきません。 文字化けしないで、UTF-8で作成されたページに表示させたいのですがどうすればよいでしょうか? 宜しくお願い致します。 ------------------------------------ $qs = $ENV{'QUERY_STRING'}; use Encode::Guess qw/ shiftjis /; use Encode qw/ decode /; $enc = guess_encoding ( $qs ); if ( ref $enc ) { $utf8 = decode ( $enc->name , $qs ); } $qs =~ tr/+/ /; $qs =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print "$qs";

    • ベストアンサー
    • Perl
  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Perlの5.8のデコードと from_to関数?

    UTF-8に不慣れで感じがまだ、つかめておりません。 ○ encode('shiftjis', decode('utf8', $utf_str)); とすると、正しく漢字が表示されましたが、 × encode('shiftjis', $utf_str)); とすると、?????などの文字列が表示されます。 $utf_strは UTF-8だと思いますが、 decode('utf8', $utf_str)が必要な理由はなんでしょうか? あと、Perl5.8では from_toがありますが上と同じ事を from_to($utf_str, "utf8", "shiftjis"); とできるということでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう