Home PageКаталог Изменения НовыеКомментарии Пользователи Регистрация
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() с параметром '..', я поднимаюсь на уровень выше и прохожу по всему содержимому.


 
Комментарии

Есть ещё одно (и, по-моему, гораздо более простое) решение
в начале файла APP/webroot/index.php прописать вызов функции

<?php
ob_start
();
// Остальной код

Этой функцией вы включите запись всего потока в буфер. То есть сигнатура BOM (как, впрочем, и остальные символы) не будет выводиться до тех пор, пока PHP не прочитает все файлы и не выполнит все инструкции. После этого он отдаст заголовки HTTP, а после выплеснет всё, чего он нахватался (-:

AleksandroSemjonov (2007-12-30 03:56:20)

А зачем мне складывать содержимое в буфер при каждом выполнении скриптов, если можно один раз при разработке запустить этот скрипт и он разом решит проблему.

AntonIsaykin (2007-12-30 14:39:56)

В среде разработки от Rapid(К примеру у меня We Builder 2007? ) в properties->files->general выставляем кодировку для новых файлов UTF-8 without BOM

unknown (2008-01-12 16:14:08)

И кстати очень замечательно BOM символы видит Zend

unknown (2008-01-12 16:17:32)
Спасибо, очень помогло, уже не знал на что думать )
95.82.205.120 (2009-04-26 19:36:05)
все редакторы базированные на Eclipse нормально UTF-8 воспринимают, без БОМа
95-55-13-140.dynamic.avangarddsl.ru (2009-06-08 00:06:54)
Спасибо! Помогла перекодировка без ВОМ.
94.180.207.34 (2010-07-12 10:19:22)
Помогло,Благодарю за информаци!
nat.222-70.maryno.net (2010-08-25 21:40:25)
счастливым обладателям notepad++, чтобы не сохранять каждый раз без бом, заходим : опции > настройки > новый документ > в поле «кодировка» ставим точку напротив «utf-8 без метки BOM»
/Fresh Роман? (2011-02-07 00:58:44)
Спасибо большое)
220.185.47.77.pptp.ntu-kpi.kiev.ua (2011-02-17 14:24:29)
Спасибо за без бом
178.206.27.167 (2011-08-26 09:33:03)
Спасибо за идею (=
95-181-2-6.goodline.info (2012-01-12 12:15:22)
))) спасибо
31-15-85-99.broadband.progtech.ru (2012-03-10 04:31:51)
Добавить комментарий:

Файлов нет. [Показать файлы/форму]