漢字コードを指定したファイルコピー
ファイルをコピーするときに、コピー先のファイルの漢字コードを任意にしたい場合が結構あります。
コピー先のファイルは、ロジックで漢字コードが指定できますね。
しかし、コピー元のファイルの漢字コードが想定できない場合が結構あります。
そんな時のためのルーチンを組んでみました。
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回の読み込みでファイル全体を一気に読み込みます。