[kansaipm] Re: [kansaipm] use encodingの使い方
Dan Kogai
dankogai at dan.co.jp
Tue May 13 11:16:52 CDT 2003
On Tuesday, May 13, 2003, at 11:32 PM, 片松 祐司 wrote:
> 片松@凸版 です
>
> お久しぶりです
お久しぶりです。
> perl5.8を用いて
> 入力ファイル euc-jp
> スクリプトファイル euc-jp
> 出力 iso-2022-jp
>
> となるプログラムを組もうと、以下のようにスクリプトを書いたのですが、
> 上手く行きません。\x{5b65}…などの表記になります
最初はちょっとびっくりしましたが、よく見たら当然ですね。
> -----(ココから)-----
> #!/usr/local/bin/perl -Tw
> use strict;
> use encoding 'euc-jp', STDOUT => 'iso-2022-jp';
> #use encoding 'euc-jp', STDIN => 'euc-jp', STDOUT => 'iso-2022-jp';
>
> print "Content-Type: text/html; charset=ISO-2022-JP\n\n";
> open IN,'<','./index.html' or die $!;
> my @data = <IN>;
> close IN;
> print @data;
> -----(ココまで)-----
原因は簡単で、INはコード変換が行われないからです。use encoding が変更するのは、
* script 中の literal
* STDINおよびSTDOUT
であって、File Handle 一般を変更するわけではないのです。この場合は、
open IN, '<:encoding(euc-jp)', './index.html' or die $!;
とするか、use encoding の代わりに
use open IN => ':encoding(euc-jp)', OUT => ':encoding(iso-2022-jp)';
とするのが正解です。ただし、Perl 5.8.0のopen pragmaはちょっとしたBugがあって、
> Unknown PerlIO layer 'encoding(euc-jp)' at ./e2j.cgi line 5
> Unknown PerlIO layer 'encoding(iso-2022-jp)' at ./e2j.cgi line 5
という間違った警告が出ますので、 no warnings 'layer'; で静かにする必要があります。
# bleedperlではすでにこの問題は解決済み
> 次に以下も試してみましたが、結果はeuc-jpのままでした
> -----(ココから)-----
> #!/usr/local/bin/perl -Tw
> use strict;
> use Encode qw/from_to/;
>
> print "Content-Type: text/html; charset=ISO-2022-JP\n\n";
> open IN,'<','./index.html' or die $!;
> while(<IN>){
> from_to($_, 'euc-jp', 'iso-2022-jp');
> print;
> }
> close IN;
> -----(ココまで)-----
うーん、こちらの方は問題なく動くのですが(これはまさに piconv の動作原理でもある)。
とりあえず、rule of thumb として、
* use encoding は、あくまで literal にその encoding が含まれる場合にのみ利用されるべきである
ということは挙げられるでしょう。ただ、上記のような誤解もあるので、
use encoding 'foo', IN => 'baz', OUT => 'quux';
とあった場合には
use open IN = > ':encoding(baz)', OUT => 'encoding(:quux)';
するようにすべきか検討してみます。
> 凸版印刷株式会社 関西商印事業部 販売促進本部
> Eビジネス部 Eビジネス課 システムソリューションG
> 片松 祐司 (Yuji Katamatsu)
> E-mail: yuji.katamatsu at toppan.co.jp
> TEL 06(6454)3228 FAX 06(6454)3028 トールダイヤル 8-81-3228
Dan the (J|En)code Maintainer
More information about the Kansai-pm
mailing list