Довольно многое, о чем говорит этот вопрос. Я нашел много рекомендаций о том, как удалить знак байтового порядка после чтения текста, но это кажется неправильным. Разве нет стандартного способа чтения на языке в Unicode файле с надлежащим распознаванием и обработкой спецификации?
Неа. Вы должны сделать это вручную.
Спецификация является частью порядка байтов сигнализации в кодировках UTF-16LE и UTF-16BE, поэтому имеет смысл интерпретировать UTF-16-декодеры автоматически (и многие из них).
Однако UTF-8 всегда имеет один и тот же порядок байтов и нацелен на совместимость с ASCII, поэтому включение спецификации не было предусмотрено как часть схемы кодирования, как указано, и поэтому на самом деле он не должен получать никакого специального лечения от UTF-8 декодеры.
Фальшивая спецификация UTF-8 не является частью кодировки, но ad hoc (и несколько противоречивый) маркер некоторые (преимущественно Microsoft) приложения используют, чтобы сигнализировать, что файл, вероятно, UTF-8. Это не стандарт сам по себе, поэтому спецификации, основанные на UTF-8, такие как XML и JSON, должны были сделать для него специальное разрешение.
была такая же проблема. моя функция _fread() удалит бомбу и решит проблему для меня...
/**
* Read local file
* @param file local filename
* @return Data from file, or false on failure
*/
function _fread ($file = null) {
if ( is_readable($file) ) {
if ( !($fh = fopen($file, 'r')) ) return false;
$data = fread($fh, filesize($file));
// remove bom
$bom = pack('H*','EFBBBF');
$data = preg_replace("/^$bom/", '', $data);
fclose($fh);
return $data;
}
return false;
}