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 と書いている場合)