You need to detect the three bytes and remove the BOM. Below is a simplified example on how to detect and remove the three bytes.
$str = file_get_contents('<span class="skimlinks-unlinked">yourfile.utf8.csv</span>');
$bom = pack("CCC", 0xef, 0xbb, 0xbf);
if (0 === strncmp($str, $bom, 3)) {
echo "BOM detected - file is UTF-8\n";
$str = substr($str, 3);
}
Here is a script to recursively check php files for BOM (ByteOrderMark)
$check_extensions = array('php');
define('STR_BOM', "\xEF\xBB\xBF");
$file = null;
$directory = getcwd();
$rit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST);
echo '<h1>BOM Check</h1>';
try{
foreach ($rit as $file){
if ($file->isFile()){
$path_parts = pathinfo($file->getRealPath());
if (isset($path_parts['extension']) && in_array($path_parts['extension'],$check_extensions)){
$object = new SplFileObject($file->getRealPath());
if (false !== strpos($object->getCurrentLine(), STR_BOM)) {
echo $file->getRealPath().'<br />';
}
}
}
}
} catch (Exception $e) {
die ('Exception caught: '. $e->getMessage());
}