Problemas en la salida cuando usamos include en php

Para volverse loco!
Resulta que realizando un código en php muy sencillo, veía que el código generado no se visualizaba correctamente.
Se creaban unos espacios extraños, y viendo el código fuente de forma normal y viéndolo con el Firebug, veía que no se correspondía.

El código fuente parecía estar bien, pero en el firebug las cosas me salían de una forma muy extraña, por ejemplo, algunas referencias a css y js del head, me las ponía debajo de body.

Un auténtico misterio.

A base de ir comentando a trozos el código para detectar donde estaba el problema, me di cuenta de que el error estaba cuando utilizaba la función ‘include’.

Después de utilizar include, include_once, require, require_once, con comillas dobles, con comillas simples, con paréntesis… al final, leyendo los comentarios del include de php.net, vi que un usuario comentaba que había un ‘security flaw’ y que para solucionarlo, usaba los métodos ‘ob_start()’ y ‘ob_end_clean()’ antes y después de hacer los includes.

Con la mayor parte del código comentado, al poner estas funciones, el problema parecía haberse solucionado… pero en cuanto descomenté el resto… otra vez la cosa estaba mal.

Después de muchas pruebas, frustraciones, y búsquedas en google, di con esta página: http://bugs.php.net/bug.php?id=40072

Ahí estaba la solución! El puto BOM del utf-8!! (con perdón)

Había probado el tema de la codificación de los archivos, pero no se me había ocurrido usar la codificación “utf-8 sin BOM”.

Lo peor de todo, es que entonces recordé… que esto ya me había pasado antes!!

Ayyyy… que malo es el Alzeimer…

Pues nada.
Espero que si algún día os pasa algo así, encontréis este post y os ayude a resolver rápidamente el problema.

Recordar que en notepad++ en español tenemos las opciones “utf-8” y “utf-8 sin BOM” pero que en otros editores o versiones podemos encontrarnos con “utf-8” y “utf-8 with signature”. En este último caso, habría que utilizar el “utf-8”.

Para los que tengáis la curiosidad de saber que es el BOM, que sepáis que es el ‘Byte Order Mark’ y podéis leer más en la wikipedia.