サンプル・プログラム
conv_utf8.php | サンプル・プログラム本体。 |
sjis.txt | サンプル・テキスト(シフトJIS)。 |
バージョン | 更新日 | 内容 |
---|---|---|
1.2.1 | 2021/02/06 | HTMLヘッダの修正,等 |
1.2 | 2021/02/06 | PHP8対応 |
1.1 | 2015/10/25 | ソース改善 |
1.0 | 2008/07/05 | 初版 |
解説:前準備
変数 $_FILES からは、ダイアログで指定したディレクトリ名を取得することができないため、このような変数を用意した。
変換後の改行コードを定数 NL に指定する。
ここではUNIXで通常用いられるLFコード(0x0A)にしてある。
解説:文字コード変換
75: /**
76: * テキストファイルの文字コードを変換し保存する
77: * @param string $infname 入力ファイル名
78: * @param string $incode 入力ファイルの文字コード
79: * @param string $outfname 出力ファイル名
80: * @param string $outcode 出力ファイルの文字コード
81: * @param string $nl 出力ファイルの改行コード
82: * @return string メッセージ
83: */
84: function convertCode($infname, $incode, $outfname, $outcode, $nl) {
85: $instr = @file_get_contents($infname);
86: if ($instr == FALSE) {
87: return "変換失敗:{$infname} が見あたりません.";
88: }
89: $outstr = mb_convert_encoding($instr, $outcode, $incode);
90: $outstr = str_replace(array("\r\n", "\n", "\r"), $nl, $outstr);
91:
92: $outfp = fopen($outfname, 'wb');
93: if ($outfp == FALSE) {
94: return "変換失敗:{$outfname} に書き込むことができません.";
95: }
96: fwrite($outfp, $outstr);
97: fclose($outfp);
98:
99: return "変換成功:{$infname} => {$outfname}";
100: }
この関数を利用し、入/出力ファイル名、入/出力文字コード、および出力改行文字を指定することでテキストファイルの文字コード変換を行うユーザー関数 convertCode を用意した。
関数 file_get_contents を使って一気にテキストファイルを読み込む。
続いて、関数 mb_convert_encoding で文字コードを変換する。このとき、変換元を "auto" と指定すると、変換元の文字コードを自動識別してくれる。ただし、自動識別に失敗するケースもあるので注意してほしい。
次に、関数 str_replace を使って改行コードを変換する。
最後に、関数 fopen 、 fwrite 、 fclose を使って変換したファイルを保管する。
PHP5以上であれば、関数 file_put_contents を使って一気に書き込むことができる。
参考サイト
- PHPでCSV形式ファイルを読み込んで表にする:ぱふぅ家のホームページ
そこで今回は、シフトJIS、EUC-JP、JISで書かれているテキストファイルを UTF-8 に変換するプログラムを作ることにする。PHPを使うと、ローカルディスクにあるテキストファイルの文字コードを比較的簡単に、他のコードに変換することができる。
(2023年5月4日)HTMLヘッダの修正,解説記事に加筆.