• 締切済み

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'); を直す事なく動く様にしたいのです。

みんなの回答

回答No.1

まず、encodingプラグマは使うべきではないことを断っておきます。 (参考URL参照) で、ソースコードを見る限り、euc-jpで出力されることはないような気がします。ただし、文字化けする可能性はあります。 encodingプラグマは、STDOUTを:encoding('~') とPerlIOが噛むようにしてしまいます。よって、渡すのはUTF-8フラグが立っている文字列でなければなりません。 提示頂いているスクリプトでは、encode関数によってバイト列が渡されており、この使用法は正しいものではありません。

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

補足

> encodingプラグマは使うべきではない はい、最近になって判ってきました。 以前は、 $cnt件 が ${cnt}件 では無く ${cnt件} と等価になってしまう use utf8 が大嫌いでしたが。 STDOUT にバイト列を渡しているのは事実ですが、その為には binmode(STDOUT); では不足なんでしょうか? 実際、CentOS 5.2 の場合にはコードを以下に直しても ISO-2022-JP では無く euc-jp に encode されてる事が確認できます。 #! /usr/bin/perl -w use encoding('UTF8'); use Encode; my $text = "<全角文字ですよぉ。>"; my $oct = encode('ISO-2022-JP', $text); print map(sprintf(' %02x', $_), unpack('C*', $oct)), "\n";