- ベストアンサー
Perlの文字コードを意識したファイルの読み込み方
- perl5.8でファイルを読み込む場合、文字コードを意識した方法は2つあります。
- 一つ目はファイルを'<:euc-jp'という形式で読み込む方法です。この方法で読み込んだデータはperlの内部コード(UTF8)に変換されます。
- 二つ目は通常の'<>'演算子を使用してファイルを読み込んだ後、Encodeモジュールを使用して文字コードの変換を行う方法です。
- みんなの回答 (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.html Perl 5.8.x における日本語コード変換のメモ http://www.hikoboshi.org/perl/doc/encode.html