Решение проблемы с символами BOM &#65279 при верстании шаблона под кодировку UTF8

Тип статьи:
Авторская

Многие при верстании шаблона сталкивались с задачкой — как убрать символ BOM . Большинство верстальщиков используют notepad++ или dreamweaver, с уверенностью, что у них такого символа не появится. И я был, до последнего времени, уверен, что при создании, сразу, файла с кодировкой UTF-8 таких проблем не будет. Но вот оно случилось.

Возможная причина появления данного символа(это только предположения):

1. Скорей всего вы создали файл с кодировкой ANSI, и сохранили его. После чего вы увидели косяк, и заменили на UTF8, а символ BOM так и остался.

2. У вас корявые редакторы. Переустановите их.:) А лучше не делайте так, как написано в первом пункте.

А теперь приступаем к удалению символа BOM. И так, я даюсь у вас есть виртуальный локальный и хостинговый сервер, а может не виртуальный, главное веб-сервер, на котором нужно будет запускать скрипт php. Ниже по шагово описаны все действия:

1.Обязательно делаем резервную копию файлов.

2. Создаем файл с любым именем с расширением php, например: grombom.php. И конечно же он должен быть с кодировкой UTF8, хотя я не проверял с другой.

3.В созданный файл вставляем код:

<!--?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;
// That's all I need
?-->
<a href="<a href=" http:="" www.w3.org="" tr="" xhtml1="" dtd="" xhtml1-transitiona."=""></a><a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitiona..">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitiona...</a>..">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitiona....">
<a href="<a href=" <a="">http://www.w3.org/1999/xhtml</a>">http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>UTF8 BOM FINDER and REMOVER</title>
body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
.FOUND { color: #F30; font-size: 14px; font-weight: bold; }
<!--?php
$BOMBED = array();
RecursiveFolder($HOME);
echo '<h2-->These files had UTF8 BOM, but i cleaned them:<p class="FOUND">';
foreach ($BOMBED as $utf) { echo $utf ."<br>\n"; }
echo '</p>';
// 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;
}
?>

Код проверен.

4. Файл необходимо разместить в корне сайта.

5. Запускаем скрипт: в адресной строке браузера набираем http://examplesite.ru/grombom.php

6. Ожидаем результат выполнения скрипта. Это отчет с перечисленными исправлениями.

По сути дела вот и все. Если у вас возникли вопросы, задавайте их! Я постараюсь обязательно помочь.

Если кого то не устраивает выше описанный вариант, можете по гуглить UTF8 BOM Remover. Это вроде какая то программа, но я ею не пользовался. Рекомендовать не буду. Напиши если вы ею пользовались.

28.09.2015
1781

7 комментариев

Ртел
01.09.2016 18:29
не работает.
03.09.2016 17:48
Значит вы что то не так сделали.
Это решение 100% работает, сам периодически его использую.
вася
18.09.2016 01:03
не пашет.
Дима
18.09.2016 17:36
Да, действительно скрипт не работает — попробовал на магазине на Опенкарт 2.1.0.1.
21.09.2016 17:04
Опишите вашу проблему, и лог с сервера после выполнения скрипта.
Дима
22.09.2016 15:33
Александр, я уже решил свою проблему с кодировками вот таким вот образом:
<?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;

// That's all I need
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" «www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»>
/>
UTF8 BOM FINDER and REMOVER


<?php
$BOMBED = array();
RecursiveFolder($HOME);
echo '

These files had UTF8 BOM, but i cleaned them:

';
foreach ($BOMBED as $utf) { echo $utf ."
\n"; }
echo '

';

// 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;
}
?>



сделал файл BOM.PHP, загрузил в корень магазина, всё получилось
28.09.2016 00:14
получается скрипт все же рабочий:)
Загрузка...