2005年3月25日金曜日

mod_perl + encodingプラグマでサイト全体が文字化け

perl5.8から導入されたencodingプラグマを利用してSTDOUTの文字コードを透過的にエンコーディングして出力するようなスクリプトをmod_perl環境で実行すると、encodingプラグマの影響がそれを実行したapacheプロセスに残ってしまい、それ以降に実行されるすべてのスクリプトもこの影響を受けてしまうようです。

仮にEUCでサイトを構築していた場合、
>

#!/usr/bin/env perl
use strict;
use encoding 'euc-jp', STDOUT => 'utf8';
print "Content-type: text/html; charset=utf8;\n\n";
print "こんにちは";
<
のようなスクリプトを実行してしまうと、このスクリプトを実行したApacheの子プロセスにおいて、それ以降のすべての出力がUTF8にエンコーディングされてしまい、結果サイトが文字化けしてしまうことになります。

mod_perl環境ではencodingプラグマは使用しないで、JcodeとかEncodeモジュールを利用するほうがよさそうです。

-Jcodeを使う場合
>

#!/usr/bin/env perl
use strict;
use Jcode;
print "Content-type: text/html; charset=utf8;\n\n";
print Jcode->new("こんにちは", 'euc')->utf8;
<

-Encodeのfrom_toを使う場合
>

#!/usr/bin/env perl
use strict;
use Encode;
my $str = "こんにちは";
Encode::from_to( $str, 'euc-jp', 'utf8');
print "Content-type: text/html; charset=utf8;\n\n";
print $str;
<

0 件のコメント:

コメントを投稿