PHPでテキストファイルの文字コードを変換する

(1/1)
Web の世界では、データ交換などの都合で、文字コードとしてUTF-8*が標準になりつつある。
そこで今回は、シフト JIS、EUC-JP、JIS で書かれているテキストファイルを UTF-8 に変換するプログラムを作ることにする。
PHP を使うと、ローカルディスクにあるテキストファイルの文字コードを比較的簡単に、他のコードに変換することができるからだ。

サンプル・プログラム

file タグヒアドキュメントおよび変数 $_FILES については、「PHP で CSV ファイルを読み込む」を参照してほしい。

プログラムをダウンロードする

前準備

変換結果を保管するディレクトリ名をユーザー変数 $PathName に指定する。
変数 $_FILES からは、ダイアログで指定したディレクトリ名を取得することができないため、このような変数を用意した。
space
変換後の改行コードをユーザー変数 $Nl に指定する。
ここでは UNIX で通常用いられる LF コード(0x0A)にしてある。

0011: /**
0012:  * @global string $PathName 変換結果を保存するディレクトリ
0013: */
0014: $PathName = 'C:/';
0015: 
0016: /**
0017:  * @global string $Nl 変換後の改行コード
0018: */
0019: $Nl = "\n";

文字コード変換

PHP には文字コードを変換するための関数  mb_convert_encoding  が用意されている。
この関数を利用し、入/出力ファイル名、入/出力文字コード、および出力改行文字を指定することでテキストファイルの文字コード変換を行うユーザー関数 convertCode を用意した。
space
関数 file_get_content を使って一気にテキストファイルを読み込む。
続いて、関数  mb_convert_encoding で文字コードを変換する。このとき、変換元を "auto" と指定すると、変換元の文字コードを自動識別してくれる。ただし、自動識別に失敗するケースもあるので注意してほしい。
space
次に、関数 [str_replace] を使って改行コードを変換する。
space
最後に、関数  fopen 、 fopen 、 fopen  を使って変換したファイルを保管する。
PHP5 であれば、関数  file_put_contents  を使って一気に書き込むことができる。

0021: /**
0022:  * テキストファイルの文字コードを変換し保存する
0023:  * @param string $infname  入力ファイル名
0024:  * @param string $incode   入力ファイルの文字コード
0025:  * @param string $outfname 出力ファイル名
0026:  * @param string $outcode  出力ファイルの文字コード
0027:  * @param string $nl       出力ファイルの改行コード
0028: */
0029: function convertCode($infname$incode$outfname$outcode$nl) {
0030:     $instr = file_get_contents($infname);
0031:     if ($instr == FALSE) {
0032:         return "Error! - {$infname} が見あたりません";
0033:     }
0034:     $outstr = mb_convert_encoding($instr$outcode$incode);
0035:     $outstr = str_replace(array("\r\n", "\n", "\r"), $nl$outstr);
0036: 
0037:     $outfp = fopen($outfname, 'wb');
0038:     if ($outfp == FALSE) {
0039:         return "Error! - {$outfname} に書き込むことができません";
0040:     }
0041:     fwrite($outfp$outstr);
0042:     fclose($outfp);
0043: 
0044:     return "{$infname} => {$outfname} : 変換しました";
0045: }

参考書籍

参考サイト

(この項おわり)
header