プロが教える店舗&オフィスのセキュリティ対策術

perl5.8でファイルを読み込む場合、文字コードを意識した以下のような呼び方("<:euc-jp")があるのですが
この方法で読み込んだ$datの中身はperlの内部コード(UTF8)になっているということでしょうか?
それとも、普通に("<")で読み込んで$dat = Encode::decode("euc-jp", $dat);とすべきでしょうか?

use utf8;
use Encode;

my $fname = "test.txt"; # 文字コードがEUC-JP
my $dat = "";
open(IN, "<:euc-jp", "$fname) or die "open error!";
flock(IN, 2);
while(<IN>){
$dat .= $_;
}
close(IN);

A 回答 (1件)

open の第二引数でエンコーディング指定をしたときとか、Encode::decodeを使って変換した場合は、


変換結果の文字列はUTF-8はUTF-8なのですが「UTF-8フラグ」というものが
ついたものになっています。

その意味においては、質問にあるどちらのやり方でも結果は同じです。
速度も多分優位な差は出ないような気がしますが測定しないと断言はできません。

処理対象のテキストファイルのエンコーディングがあらかじめわかっているとか、
決めうちしてよいのなら open でいいでしょうし、そうではなくていくつかのエンコーディングが混在するのなら、
別途対象のエンコーディングを判定した上で読みながら変換という二番目の手段をとればよいと思います。

> while(<IN>){
> $dat .= $_;
> }

こういう読み方はよくありません。
メモリも時間も無駄遣いしていまいます。

File::Slurp というモジュールをインストールして
$dat = read_file($filename);
とするか、モジュールを入れるのがいやなら、

open(IN, "<:euc-jp", "$fname) or die "open error!";
flock(IN, 2);
{local $/ = undef; $dat = <IN>}
close(IN)

のようにすれば一気読みができます。
ところで
> open(IN, "<:euc-jp", "$fname) or die "open error!";

この第二引数でエンコーディングしているのに :euc-jp って書き方許されてましたっけ?
:utf8 という指定はありますが、エンコーディングを指定するときは
:encoding(euc-jp) のように指定する必要があったと記憶しています。

Perl 5.8.x Unicode関連
http://www.rwds.net/kuroita/program/Perl_unicode …
Perl 5.8.x における日本語コード変換のメモ
http://www.hikoboshi.org/perl/doc/encode.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!