Cuando programamos aplicaciones web aparecen una serie de complicaciones que no tenemos habitualmente cuando programamos aplicaciones de escritorio. Una de ellas está relacionada con el BOM (Byte Order Mark). Seguro que muchos hemos tenido malas experiencias con WordPress por ejemplo, diciéndonos cosas como HTTP header have been already sent. El BOM son unos caracteres especiales que se pueden colocar al principio de un archivo para indicar si es Little o Big Endian. Actualmente, en UTF-8 por ejemplo, no es obligatorio ponerlo (de hecho se recomienda no hacerlo), pero algunos editores de texto lo ponen por defecto y de aquí vienen los problemas.
Esta entrada ha estado motivada por un extraño problema causado por el BOM, cosa que supe a posteriori.
Cuando el frontend de la aplicación enviaba una petición AJAX (desde jQuery), ésta llegaba correctamente al servidor. El servidor procesaba correctamente la petición y retornaba la respuesta JSON. A pesar de eso, del lado de jQuery la acción no seguía.
Primero pensé que la respuesta JSON estaría mal formada, así que la comprobé con un JSON checker, como es JSONLint. La respuesta JSON estaba bien formada.
Después pensé que habría algún error jQuery-Javascript cuando se ejecutaba la acción success, pero no era así. Simplemente la acción success no se ejecutaba nunca. Eso me hizo pensar de nuevo en que había algún error con la respuesta JSON. Pero, ¿cómo? si la había comprobado con un checker.
Resulta que la respuesta venía con un BOM al principio, cosa que hacía que jQuery no ejecutase la acción success, aunque la respuesta era un JSON bien formado. El problema ahora era… tengo un proyecto web con cerca de dos mil archivos PHP… ¿cómo puedo encontrar el archivo en el que se ha incluido el BOM?
Habitualmente he usado un editor que te indica si el archivo tiene BOM o no, y te permite quitarlo o cambiar la codificación, como es Notepad++, pero se habían editado demasiados archivos como para revisarlos a mano. Pensé en programar una pequeña aplicación o script para detectar archivos con BOM, pero alguien se había preocupado de hacerlo y publicarlo gratuitamente: File BOM Detector. Sencillo y efectivo. Problema resuelto.