7 Сентября 2010 11:29

Сериализация в PHP

Вы наверно уже обрадовались возможности загонять массив в файл, а потом его благополучно извлекать. Но поспешу вас огорчить - этот трюк можно проделывать тольо с массивами-списками, да и к тому же этот прикол не пройдёт с многомерными массивами. Нет, не надо думать, что php создавали идиоты, и что php это ваще не то, на чём можно программировать...

Разработчики подумали и придумали ещё две функции: Serialize() и Unserialize().

Функция Serialize возвращает упакованный вариант какого-то объекта.

Пример:
$A=array("a"=>"aa", "b"=>"bb", "c"=>array("x"=>"xx"));
$st=Serialize($A);
echo $st;
/*
Выведет: a:3:{s:1:"a";s:2:"aa";s:1:"b";s:2:"bb";s:1:"c";a:1:{s:1:"x";s:2:"xx";}}

Функция Unserialize делает всё наоборот, то есть принимает упакованый вариант, а возвращает нормальный вариант, который был до упаковки.

Пример:
$a=array(1,2,3);
$s=Serialize($a);
$a="blabla";
echo count($a); // выводит 1
$a=unserialize($s);
echo count($a); // выводит 3

С помощью этих функций можно сериализовать почти всё, что захочется (ну разве что кроме вашей собаки =)

http://web-support.ru/web-tech/php_58.shtml

Просмотров:2405 0   Комментариев:0

'bitrix:asd.share.buttons' is not a component

Перекодировка символов из любой кодировки в windows-1251

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

Выход из ситуации был следующий.
1. Нашел статью по этому адресу charset_x_win
charset_x_win -- Преобразовать строку на русском языке из неизвестной кодировки в кодировку windows-1251

Описание

string charset_x_win(string $s);

Требуемая библиотека: a.charset
Конвертирует строку из неизвестной кодировки в кодировку windows-1251.
еще можно скачать здесь

Строка в неизвестной кодировке. В текущей версии эта строка может быть в одной из кодировок: windows-1251, koi-8r, utf-8. Строка должна быть на русском языке.



Замечание: Поскольку вопрос корректности кодировки не касается символов с кодом меньше 128, то входная строка может быть так же и на английском, в транслите или на любом другом языке, в котором используются только символы с кодом меньше 128.

Функция правильно обрабатывает буквы Ё,ё и символы «».

Функция специальным образом оптимизирована для конвертирования коротких фраз. Суть оптимизации состоит в подсчёте недопустимых двух- и трёх-символьных последовательностей для слов русского языка. Для конвертирования больших текстов вполне подходят и более простые методы, состоящие в простом подсчёте допустимых/недопустимых символов.

Однако функция может быть использована и для конвертирования текстов значительных размеров. При конвертировании больших текстов для анализа кодировки используется начальный фрагмент текста, в котором содержится 256 символов с кодом больше 127.

Работа функции состоит в следующем. Исходная строка последовательно конвертируется из всех предусмотренных кодировок в кодировку windows-1251. Для каждого варианта конвертирования определяется некоторый числовой вес, который соответствует степени корректности фразы на русском языке. Этот вес зависит от следующих параметров входной строки:

количество «хороших символов».

Хорошими считаются символы, соответствующие буквам А-Я и а-я. Чем больше хороших символов, тем выше вероятность того, что кодировка - правильная.

количество «плохих символов».

Плохими считаются символы, с кодом больше 127, но которые не соответствуют буквам А-Я и а-я. Чем больше плохих символов, тем меньше вероятность того, что кодировка - правильная.

количество недопустимых последовательностей из двух и из трёх символов в русском языке.

Считается, что в русском языке не могут встретиться, например, последовательности из двух символов такие как «аы» или «нъ» или из трёх символов, например, такие как «юаа» или «йвб». Чем больше в строке таких последовательностей, тем меньше вероятность того, что кодировка - правильная.

2. У себя в коде программы ставим такую вот заплатку
Код
include $_SERVER["DOCUMENT_ROOT"]."/catalog/a.charset.php";
$s= charset_x_win($_REQUEST['kw']);
$kw =  iconv("windows-1251", "UTF-8", $s);


В двух слова. Сначала конвертим то что приходит в кодировку windows-1251, а потом в то что нам нужно UTF-8.

Просмотров:4275 0   Комментариев:0

'bitrix:asd.share.buttons' is not a component

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

Недавно переносил сайт и столкнулся со следующей ошибкой В начале заголовка стали появляться некие пробелы. При просмотре кода никаких ошибок не было. Да и странно на старом сервере все работало а на новом такие косяки.
Пришлось порыться в инете. Результат поиска целая статья как бороться с этой напастью. Вот она.

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

Решений у этой проблемы несколько:
  • Перейти на Линукс, т.к. UTF-8 для него родной :-).
  • Пользоваться редакторами вроде Notepad++ (но даже в нем мы не увидим этих символов. Все что нам нужно это после редактирования файла нажать Кодировки->Кодировать в UTF-8 (без BOM)).





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

Код
<pre>
<?
    function duff($filename) {
        echo $filename . ' <-- ';
        $symbols = chr(239) . chr(187) . chr(191);
        $file = file($filename);
        if (isset($file[0]) && strlen($file[0]) > 0 && strpos($file[0], $symbols) === 0) {
            $file[0] = str_replace($symbols, '', $file[0]);
            $handle = fopen($filename, 'w');
            fwrite($handle, join('', $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($file, strrpos($file, '.')), $ext)) {
                        duff($dir . '/' . $file);
                    }
                }
            }
        }
    }

    duif('..');
    
?>
</pre>


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

Оригинал статьи здесь http://www.denvo.ru/pub/programming/remove-spare-chars.html

Просмотров:3407 0   Комментариев:0

'bitrix:asd.share.buttons' is not a component

IT-технологии
WEB сервера, настройка и конфигурирование, интересные решения
Программирование
WEB программирование, WEB дизайн, Кросс-браузерная верстка
Технические науки
Физика, Математика, Химия и все-то, что лежит в основе наших знаний