Byte Order Mark (BOM) в PHP — как определить?

А очень просто!
Для этого вам понадобится вот такой вот код:

// читаем содержимое файла
$file = file_get_contents($path);
$sets = array(
	"\xFE\xFF" => "UTF-16BE",
	"\xFF\xFE" => "UTF-16LE",
	"\xFE" => "UTF-16",
	"\xFF" => "UTF-16",
	"\xEF\xBB\xBF" => "UTF-8",
	"\x2B\x2F\x76\x38\x2D" => "UTF-7",
	"\x2B\x2F\x76\x38" => "UTF-7",
	"\x2B\x2F\x76\x38" => "UTF-7",
	"\x2B\x2F\x76\x2B" => "UTF-7",
	"\x2B\x2F\x76\x2F" => "UTF-7",
	"\xF7\x64\x4C" => "UTF-1",
	"\x0E\xFE\xFF" => "SCSU",
	"\xFB\xEE\x28" => "BOCU-1",
	"\x00\x00\xFE\xFF" => "UTF-32BE",
	"\xFF\xFE\x00\x00" => "UTF-32LE",
	"\xDD\x73\x66\x73" => "UTF-EBCDIC",
	"\x84\x31\x95\x33" => "GB-18030",
);
// предполагаем, что изначально файл у нас не в utf
$is_utf = false;
$source_charset = "";
foreach ($sets as $bom => $charset) {
	// определяем битовый маркер
	if (mb_substr($file, 0, mb_strlen($bom)) == $bom) {
		// отрезаем битовый маркер и запоминаем кодировку
		$file = mb_substr($file, mb_strlen($bom));
		$source_charset = $charset;
		$is_utf = true;
		break;
	}
}
if (!$is_utf){
	// строка не в юникод кодировке, поэтому делаем соответсвующие, нужные вам преобразования
}else{
	// строка в юникоде, конвертируем ее в utf-8 или же в любую другую удобную вам кодировку
	$file = iconv($source_charset, "UTF-8", $file);
}

Таким образом вы сможете успешно определить кодировку присланного вам файла и распарсить его без лишних трудозатрат