[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