CakePHP: Articles/BOM

Избавляемся от BOM-символов

Автор Антон Исайкин

Почти все текстовые редакторы под Windows вставляют в самое начало текста так называемые BOM-символы (в народе яЛП) при использовании кодировки UTF-8. Делается это для того чтобы потом самим понять что за кодировка, т.к. для Windows она не родная. Плохо это тем, что при работе Cake сначала подгружаются все используемые файлы, а только потом производится вывод контента в браузер. До вывода контента посылается несколько заголовков. И так и должно быть, сначала заголовки, потом контент. Но т.к. в файлах появляются некие символы, еще до начала конструкции <?, то заголовки уже не распознаются браузером и получается полная чушь. PHP нам говорит, что мы что-то выводим в браузер до последних заголовков, Cake перестает видеть сессии и куки, а нам остается только пожимать плечами, потому что совершенно не понятно о чем речь — открываем файлы блокнотом, а там все чисто!

Решений у этой проблемы несколько:

Но у меня все сложнее, ибо макеты приходят из одного места, а контроллеры пишут разные люди. Поэтому самый простой вариант, который я для себя выбрал — это написать небольшой скрипт, который просто обходит ВСЕ файлы, которые связаны с работой Cake и удаляет лишние символы. Вот код скрипта:

<pre>

<?

    function duff($filename) {

        echo $filename ' <-- ';

        $symbols chr(239) . chr(187) . chr(191);

        $file file($filename);

        if (isset($file[0]) && strlen($file[0]) > && strpos($file[0], $symbols) === 0) {

            $file[0] = str_replace($symbols''$file[0]);

            $handle fopen($filename'w');

            fwrite($handlejoin(''$file));

            fclose($handle);

            echo 'ОБНАРУЖЕН яЛП!';

        } else {

            echo 'Чисто.';

        }

        echo "\n";

    }

    

    function duif($dir) {

        $ext = array('.php''.ctp');

        $files scandir($dir);

        foreach ($files as $file) {

            if (!in_array($file, array('.''..'))) {

                if (is_dir($dir '/' $file)) {

                    duif($dir '/' $file);

                } else {

                    if (in_array(substr($filestrrpos($file'.')), $ext)) {

                        duff($dir '/' $file);

                    }

                }

            }

        }

    }

    duif('..');

    

?>

</pre>

Здесь duif() ходит по директориям и отдает на просмотр все файлы с расширениями, указанными в массиве $ext, функции duff(), которая и занимается чисткой. Я положил файлик со скриптом в webroot. Все файлы системы находятся на одном уровне с webroot, поэтому вызывая duif() с параметром '..', я поднимаюсь на уровень выше и прохожу по всему содержимому.