小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

漢字コードを指定したファイルコピー

ファイルをコピーするときに、コピー先のファイルの漢字コードを任意にしたい場合が結構あります。
コピー先のファイルは、ロジックで漢字コードが指定できますね。
しかし、コピー元のファイルの漢字コードが想定できない場合が結構あります。
そんな時のためのルーチンを組んでみました。


encCopy関数の仕様は、以下の通り。

  • 第1引数がコピー先ファイルの漢字コード
    • euc-jp,shiftjis,7bit-jis,utf8が指定できる
  • 第2引数がコピー元ファイルパス名(入力ファイル)
    • euc-jp,shiftjis,7bit-jis,utf8の各々の漢字コードのファイルに対応
  • 第3引数がコピー先ファイルパス名(出力ファイル)
use strict;
use warnings;
use Encode::Guess;
use Encode qw(from_to);

encCopy('euc-jp', 'txt_utf8.txt', 'txt.txt');

sub encCopy {
    my($encode, $f_form, $f_to) = @_;
    local $/ = undef;
    open(my $fh, '<', $f_form) or die('エラー情報' . "open error $f_form ($!)");
    my $fileBody = <$fh>;
    close($fh);

    my $enc = guess_encoding($fileBody, qw/euc-jp shiftjis 7bit-jis/);

    if (ref $enc) {
        from_to($fileBody, $enc->name, $encode);
        open($fh, '>', $f_to) or die('エラー情報' . "open error $f_to ($!)");
        print $fh  $fileBody;
        close($fh);
    }
    else {
        print "漢字コード推測できず!($enc\n";
    }
}

補足

『local $/ = undef;』のlocal関数は、グローバル変数『$/』を局所化します。
つまり、『$/』に対する変更が、このサブルーチン(encCopy)内だけ有効になるのです。
『$/』にundefを代入すると、1回の読み込みでファイル全体を一気に読み込みます。

補足の補足

kitsさんから、情報を頂きました。いつもありがとうございます。

local $/; だけでも $/ は未定義となります。

確かにそうなりました。


できれば、本ブログの応援クリック も、よろしくお願い致します。