dポイントプレゼントキャンペーン実施中!

use utf8;
binmode(STDIN,":encoding(shiftjis)");

をすると、入力時に内部変換がかかり、UTF-8として扱える
という認識で使っていたのですが、下記のコードを実行してみると
入力した文字は普通に sjisで表示されます。

binmode(STDIN~
はどのような意味を持つのでしょうか。

http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl …
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 );
}

A 回答 (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_unic …
    • good
    • 0
この回答へのお礼

ありがとうございます。
読みつついろいろ実験してみたのですが、どうも自分が
求めているのとは違うものみたいでした。^^;

標準入力のSJISを勝手にUTF-8に変換してくれるのかとか、
そんなようなものを期待していたのですが。

お礼日時:2006/01/25 00:50

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