- 締切済み
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'); を直す事なく動く様にしたいのです。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- 11th_style
- ベストアンサー率50% (45/90)
まず、encodingプラグマは使うべきではないことを断っておきます。 (参考URL参照) で、ソースコードを見る限り、euc-jpで出力されることはないような気がします。ただし、文字化けする可能性はあります。 encodingプラグマは、STDOUTを:encoding('~') とPerlIOが噛むようにしてしまいます。よって、渡すのはUTF-8フラグが立っている文字列でなければなりません。 提示頂いているスクリプトでは、encode関数によってバイト列が渡されており、この使用法は正しいものではありません。
補足
> 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";