Символ BOM в шаблонах 

Всем привет, в шаблоне появился символ BOM (), который ломает верстку и делает отступ на одну строку.

(Что это такое, можете узнать по ссылке https://phpdes.com/other/simvol-65279-problema-ver... ну или просто введите в поиск )

Сами файлы шаблонов собраны в UTF-8 без BOM, а вебасист по видимому добавляет в процессе компиляции.

Кто знает, как избавиться от данной проблемы?


3 ответа

  • 2

    Не уверен что проблема в движке, скорее в ваших файлах

    Создайте в корне файл bom.php с содержимым

    <?php
    check_dir('.', 0);
    check_dir('./wa-apps', 1);
    check_dir('./wa-config', 1);
    check_dir('./wa-content', 1);
    check_dir('./wa-data', 1);
    check_dir('./wa-system', 1);
    
    function check_dir($path, $recurs) {
        if ($dir = @opendir($path)) {
            while($file = readdir($dir)) {
                if ($file == '.' or $file == '..') { 
                    continue;
                }
                $file = $path . '/' . $file;
                if (is_dir($file) && $recurs)  {
                    check_dir($file, 1);
                }
                if (is_file($file) && strstr($file,'.php')) {
                    $f = fopen($file,'r');
                    $t = fread($f, 3);
                    if ($t == "\xEF\xBB\xBF") {
                         echo "$file<br>\n";
                    }
                    fclose ($f);
                }
            }
            closedir($dir);
         }
    }

    и запустите в браузере http://site.ru/bom.php

    P.S. хотя по вашей ссылке же есть также скрипт для проверки файлов на BOM, в чем проблема его запустить? и найти причину

  • 1
    Владислав Горлов Webasyst 10 февраля 2017 13:37 #

    BOM появляется после редактирования файлов в редакторе, что не поддерживает UTF-8 (часто это notepad)

  • 1
    Вадим 11 августа 2020 13:40 #

    Ответ выше у меня не сработал. Сработало это:


    <?php 
    // Tell me the root folder path.
    // You can also try this one
    // $HOME = $_SERVER["DOCUMENT_ROOT"];
    // Or this
    // dirname(__FILE__)
    $HOME = dirname(__FILE__);
     
    // Is this a Windows host ? If it is, change this line to $WIN = 1;
    $WIN = 0;
     
    // Recursive finder
    function RecursiveFolder($sHOME) {
        global $BOMBED, $WIN;
        $win32 = ($WIN == 1)? "\\" : "/";
        $folder = dir($sHOME);
        $foundfolders = array();
        while ($file = $folder->read()) {
            if($file != "." and $file != "..") {
                if(filetype($sHOME . $win32 . $file) == "dir"){
                $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
                }else{
                    $content = file_get_contents($sHOME . $win32 . $file);
                    $BOM = SearchBOM($content);
                    if($BOM){
                        $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
                        // Remove first three chars from the file
                        $content = substr($content,3);
                        // Write to file 
                        file_put_contents($sHOME . $win32 . $file, $content);
                    }
                }
            }
        }
        $folder->close();
        if(count($foundfolders)>0){
            foreach($foundfolders as $folder){
                RecursiveFolder($folder, $win32);
            }
        }
    }
     
    // Searching for BOM in files
    function SearchBOM($string){ 
        if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
        return false; 
    }
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>UTF8 BOM FINDER and REMOVER</title>
    <style>
    body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
    .FOUND { color: #F30; font-size: 14px; font-weight: bold; }
    </style>
    </head>
    <body>
    <?php
    $BOMBED = array();
    RecursiveFolder($HOME);
    echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
    foreach($BOMBED as $utf){
        echo $utf ."<br />\n";
    }
    echo '</p>';
    ?>
    </body>
    </html>

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите