Función PHP fread () que devuelve caracteres adicionales en el frente en archivos de texto UTF-8

Mientras estoy usando fread() en un archivo de texto normal (por ejemplo: archivo ANSI guardado normalmente con el Bloc de notas), la cadena de contenido devuelto es correcta, como todos saben.

Pero cuando leo el archivo de texto UTF-8, la cadena de contenido que regresa contiene caracteres invisibles (en la parte frontal). La razón por la que dije invisible es que los caracteres adicionales no se pueden ver normalmente en la salida (por ejemplo, echo solo para lectura). Pero cuando la cadena de contenido se utiliza para el procesamiento (por ejemplo: crear un enlace con valor href ), el problema surge entonces.

 $filename = "blabla.txt"; $handle = fopen($filename, "r"); $contents = fread($handle, filesize($filename)); fclose($handle); echo 'https://stackoverflow.com/questions/9126423/php-fread-function-returning-extra-characters-at-the-front-on-utf-8-text-files/'.$contents.''; 

Puse solo http://www.google.com en el archivo de texto de encoding UTF-8. Mientras ejecuta el archivo PHP, verá un enlace de salida http://www.google.com
.. pero nunca alcanzarás a Google.

Porque la fuente de direcciones href es así:

 %EF%BB%BFhttp://www.google.com 

Significa, fread %EF%BB%BF añadidos fread en el frente.

Esto es algo extra molesto. ¿Por qué está sucediendo?

Adicional:
Algunos señalando que es BOM. Entonces, BOM o lo que sea, está cambiando mis valores originales. Así que ahora, es un problema con otros pasos, llamadas a funciones, etc. Ahora tengo que substr($string,3) para todas las salidas. Esto es totalmente sin sentido cambiando los valores originales.

Esto se llama la lista de materiales UTF-8. Consulte http://en.wikipedia.org/wiki/Byte_order_mark

Es algo que se agrega opcionalmente al inicio de los archivos Utf-8, lo que significa que está en el archivo, y no agrega algo que fread. La mayoría de los editores de texto no mostrarán la lista de materiales, pero algunos lo harán, principalmente aquellos que no lo entienden. No todos los editores lo agregarán a los archivos Utf-8, pero una vez más, algunos lo harán …

Para Utf-8 no se recomienda el uso de BOM, ya que no tiene ningún significado y en muchos casos no se entiende.

Es UTF-8 BOM. Si mira los documentos de fread ( aquí ) alguien ha discutido una solución para ello.

La solución dada allí es la siguiente

 // Reads past the UTF-8 bom if it is there. function fopen_utf8 ($filename, $mode) { $file = @fopen($filename, $mode); $bom = fread($file, 3); if ($bom != b"\xEF\xBB\xBF") rewind($file, 0); else echo "bom found!\n"; return $file; }