27 August 2008

(PHP) UTF-8データファイルのBOM除去

PHPでUTF-8形式のファイルを読み込んだ場合、ファイルの先頭データがBOM (Byte Order Mark = EFBBBF)というのになっている場合がある。(Windowsメモ帳はBOMを自動的に挿入する。フリーウエアのテキストエディタではUTF-8Nを選択すればBOMは挿入されない)

PHPスクリプト側で対処するとこうなる

<?php mb_language('Japanese'); mb_internal_encoding('Shift_JIS'); mb_http_output('Shift_JIS'); $hFile = fopen('read_csv_data.csv', 'r'); if($hFile == FALSE) { // ファイルオープンエラー die; } while(!feof($hFile)) { $sTmp = fgets($hFile); if($sTmp[0] == chr(0xef) && $sTmp[1] == chr(0xbb) && $sTmp[2] == chr(0xbf)) { // UTF-8 BOMを取り除く $sTmp = substr($sTmp, 3); } // 16進数で、UTF-8と、SJIS変換の文字列を出力 print("<p>".bin2hex($sTmp)."</p>\n"); print("<p>".bin2hex(mb_convert_encoding($sTmp, 'SJIS-Win', 'UTF-8'))."</p>\n"); } fclose($hFile); ?>

話は変わるが、PHPのソースコードをBOM付きのUTF-8で保存した場合は、PHPスクリプトとして認識しない場合がある。(先頭行に<?php と書いている場合)