Quan programem aplicacions web apareixen una sèrie de complicacions que no tenim habitualment quan programem aplicacions d’escriptori. Una d’elles és relacionada amb el BOM (Byte Order Mark). Segur que molts hem tingut males experiències amb WordPress per exemple, dient-nos coses com HTTP header have been already sent. El BOM són uns caràcters especials que es poden col·locar al principi d’un arxiu per indicar si és Little o Big Endian. Actualment, en UTF-8 per exemple, no és obligatori posar-lo (de fet es recomana no fer-ho), però alguns editors de text el posen per defecte i d’aquí vénen els problemes.
Aquesta entrada ha estat motivada per un extrany problema causat pel BOM, cosa que vaig saber a posteriori.
Quan el frontend de l’aplicació enviava una petició per AJAX (des de jQuery), aquesta arribava correctament al servidor. El servidor processava correctament la petició i retornava la resposta JSON. Tot i això, del costat de jQuery l’acció no seguia.
Primer vaig pensar que la resposta JSON estaria mal formada, així que la vaig comprovar amb un JSON checker, com JSONLint. La resposta JSON estava ben formada.
Després vaig pensar que hi havia algun error jQuery-Javascript quan s’executava l’acció success, però no era això. Simplement l’acció success no s’executava mai. Això em va fer pensar de nou que hi havia un error amb la resposta JSON. Però, com? si l’havia comprovada amb un checker.
Resulta que la resposta venia amb un BOM al principi, cosa que feia que jQuery no executara l’acció success, tot i que la resposta era un JSON ben format. El problema ara era… tinc un projecte web amb prop de dos mil arxius PHP… com puc trobar l’arxiu on s’ha inclòs el BOM?
Habitualment he usat un editor que t’indica si l’arxiu té BOM o no, i et permet llevar-lo o canviar la codificació, com és Notepad++, però s’havien editat massa arxius com per a revisar-los a mà. Vaig pensar en programar alguna xicoteta aplicació o script per a detectar arxius amb BOM però algú s’havia preocupat de fer-ho i publicar-ho gratuïtament: File BOM Detector. Senzill i efectiu. Problema solucionat.