Самостоятельное создание сайта
Самостоятельная раскрутка и продвижение сайта

Как удалить символ 65279

Недавно мне пришлось обновлять старый сайт. Мне нужно было приконтачить к нему backend в виде фреймворка Symfony.  И в результате я столкнулся с такой проблемой как появление в шаблонах символа  Этот символ появился из-за того, что фреймворк Symfony, был первоначально создан в UTF-8 кодировки, а сайт в windows-1251 кодировке. Таким образом, чтобы обьединить обе части, я решил перевести все в одну кодировку, в UTF-8. 

Перекодировал шаблоны я с помощью обычного блокнота, их было не много, поэтому я решил сделать это вручную. Просто открываешь файлы блокнотом и пересохраняеш их в кодировке UTF-8. 

Но, в результате на страницах сайта появились отступы, а firebug показал мне, что это какие-то непонятные символы . Причем эти символы находились в самых разных местах: и в тех где подключался подшаблон, и в корне тега body, хотя там вообще ничего не подключалось и в главном шаблоне вообще даже пустых промежутков между тагами не было.

Немного погуглив, я нашел причину, это было наличие в перекодированных страницах Byte_order_mark (BOM). Он создается в начале текстового файла с кодировкой UTF-8 и появился когда я пересохранил файлы из кодировки windows-1251 в кодировку UTF-8.  

Наличие BO M в файлах необязательное, поэтому решение проблемы очень простое, нужно просто найти все файлы с BO M и перекодировать их в UTF-8 без BOM, короче говоря удалить этот Byte orde r mark из всех файлов.

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

И тогда я нашел программное решение на php, которое за пару секунд удалило из всех файлов BOM символы. Первый пример функции pack наглядно показывает, как удалить BOM символ из текста или файла. На основе этого, я также нашел готовый скрипт, который немного модифицировал. Все что Вам нужно, это создать файл перекопировав код и поместить его в корень сайта, а потом 1 раз выполнить (перед этим рекомендую сделать резервную копию сайта, так как скрипт пробежит по все файлам рекурсивно и мне было малость страшновато, как бы потом не оказалось, что вырезано лишнее):

<?php
//указываем путь к root файла,
//отталкиваясь от этого пути будет идти рекурсия в глубину
$HOME = dirname(__FILE__);

//если в качестве ОС стоит Windows, то $WIN = 1;
//это нужно для правильного составления пути
$WIN = 1;

?>
<!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);
if (!empty($BOMBED)){
echo '<h2>Эти файлы имели кодировку UTF8 и хранили BOM символы, но по результатам скрипта все символы BOM были удалены:</h2><p class="found">';
foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
echo '</p>';
} else {
echo "<h2>По результатам скрипта: ни одного файла с кодировкой UTF8 с BOM символами не найдено.</h2>";
}


// функция рекурсивно находит все файлы BOM
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;

// удаляем первые три символа
$content = substr($content,3);
// сохраняем обратно в файл
file_put_contents($sHOME . $win32 . $file, $content);
}
}
}
}
$folder->close();

if(count($foundfolders) > 0) {
foreach ($foundfolders as $folder) {
RecursiveFolder($folder, $win32);
}
}
}

// проверяем наличие BOM символов в файле
function SearchBOM($string) {
if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
return false;

}

?>
</body>
</html>

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

501
3.5 25
Рейтинг: +3.5 , голосов 25
Вы еще не голосовали!
Добавить комментарий (комментариев: 3)
Удалить ответ

Ваш почтовый ящик никогда не будет опубликован
Трудно разобрать цифры? Нажмите на рисунок, чтобы обновить.
#1 10/11/2013 17:28 Евгений
reply
Спасибо за решение, очень полезный скрипт )
#2 20/12/2012 18:36 qwer
reply
Скажите а как выполнить его?
#3 06/06/2012 13:06 Сэн
reply
Большое спасибо, тоже возник вопрос WTF?! при переходе от ср1251 к utf8, если скрипт кидать в корень сайта, то $HOME = dirname(__FILE__); будет пустым - $HOME = dirname(); а $WIN - любое не равное 1, например 0

Дополнительно

» С чего начать сайт?

» Установка программ

» Пример создания сайта

» Хостинг и домен

» Оптимизация сайта

» Раскрутка сайта

» Заработок web-мастера

» Примеры PHP/Javascript

» Блог и мои записки

Последние новости

Статьи по рейтингу

» Особенности покупки контента 5.0 1
» Выбор хостинга 4.8 5
» Поисковые системы 4.7 9
» Курс молодого web-мастера 4.6 21
» Где взять бесплатные ссылки 4.5 11
» Что такое сниппеты 4.5 6
» Addstudio - SEO модуль 4.5 4
» Отладка js и CSS 4.4 14
» Стратегия дохода на Sape.ru 4.3 3
» Каталоги и биржи статей 4.3 4