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

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

(2021 年 2 月 6 日)PHP8 対応

サンプル・プログラム

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

download ダウンロード(PHP8対応)

解説:前準備

変換結果を保管するディレクトリ名を定数 PATH_NAME に指定する。
変数 $_FILES からは、ダイアログで指定したディレクトリ名を取得することができないため、このような変数を用意した。

変換後の改行コードを定数 NL に指定する。
ここでは UNIX で通常用いられる LF コード(0x0A)にしてある。

0025: //変換結果を保存するディレクトリ
0026: define('PATH_NAME', 'C:/');
0027: 
0028: //変換後の改行コード
0029: define('NL', "\n");

解説:文字コード変換

PHP には文字コードを変換するための関数  mb_convert_encoding  が用意されている。
この関数を利用し、入/出力ファイル名、入/出力文字コード、および出力改行文字を指定することでテキストファイルの文字コード変換を行うユーザー関数 convertCode を用意した。

関数  file_get_contents  を使って一気にテキストファイルを読み込む。
続いて、関数  mb_convert_encoding で文字コードを変換する。このとき、変換元を "auto" と指定すると、変換元の文字コードを自動識別してくれる。ただし、自動識別に失敗するケースもあるので注意してほしい。

次に、関数  str_replace  を使って改行コードを変換する。

最後に、関数  fopen 、 fwrite 、 fclose  を使って変換したファイルを保管する。
PHP5 であれば、関数  file_put_contents  を使って一気に書き込むことができる。

0072: /**
0073:  * テキストファイルの文字コードを変換し保存する
0074:  * @param string $infname  入力ファイル名
0075:  * @param string $incode   入力ファイルの文字コード
0076:  * @param string $outfname 出力ファイル名
0077:  * @param string $outcode  出力ファイルの文字コード
0078:  * @param string $nl       出力ファイルの改行コード
0079:  * @return string メッセージ
0080: */
0081: function convertCode($infname$incode$outfname$outcode$nl) {
0082:     $instr = @file_get_contents($infname);
0083:     if ($instr == FALSE) {
0084:         return "変換失敗:{$infname} が見あたりません.";
0085:     }
0086:     $outstr = mb_convert_encoding($instr$outcode$incode);
0087:     $outstr = str_replace(array("\r\n", "\n", "\r"), $nl$outstr);
0088: 
0089:     $outfp = fopen($outfname, 'wb');
0090:     if ($outfp == FALSE) {
0091:         return "変換失敗:{$outfname} に書き込むことができません.";
0092:     }
0093:     fwrite($outfp$outstr);
0094:     fclose($outfp);
0095: 
0096:     return "変換成功:{$infname} => {$outfname}";
0097: }

(この項おわり)
header