Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смещение из-за невидимого байта, Появляются вопросики 
:(
    Опции темы
fridkaratel
Дата 1.5.2011, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Доброго времени суток!

Парсю один сайтик, и возникла странная особенность...  smile 

Суть проблемы:
Заметил, что при парсинге через просмотр var_dump() появляются вопросы вместо некоторых букв, хотя в Firefox всё отображается нормально...
Соответственно, в БД записывается с вопросиками. А потом эти вопросики и вылазят при просмотре...

Изучив, всё-таки нашёл проблему.  smile 
Как оказалось, вставляется лишний байт 0xC2... Из-за этого происходит смещение, поэтому и возникают вопросики.

Написал простенький скрипт, который показывает HEX-коды каждой буквы в строке:
Код
$s = '';
for ($a = 0; $a < mb_strlen($text); $a++) {
    $b2h = bin2hex(mb_substr($text, $a, 1));
    $s .= mb_substr($text, $a, 1) . '=' . $b2h . "\n";
}
die($s);


Привожу выдержки из результата обработки:
Код
р=d180
а=d0b0
??=c2d0
?=be
т=d182
д=d0b4


Тут имеется ввиду строка "набора отдельно", но получается, что происходит смещение и как результат строка "набора???тдельно"
Вставился лишний байт c2, из-за этого:
Код
Должно быть:   d180 d0b0    d0be d182 d0b4
На самом деле: d180 d0b0 c2d0 be d182 d0b4


Такое встречается несколько раз в разных местах...
Как побороть эту проблему?  smile 

Конфигурация:
Кодировка на сайте: UTF-8
Кодировка скрипта: UTF-8
Веб-сервер: XAMPP
PHP: 5.3.4

Это сообщение отредактировал(а) fridkaratel - 1.5.2011, 10:19
PM   Вверх
fridkaratel
Дата 2.5.2011, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



В-общем, написал мини-костыль, который исправляет эту бадью с вопросиками...

Код
function TextRepair($text) {//Функция для избавления от вопросиков - удаления ненужныйх байтов из строки
    // >> Необходимо для отладки в случае чего
    $dbg=true;
    $dbg=false;
    if ($dbg) {
        $s = '';
        for ($a = 0; $a < mb_strlen($text); $a++) {
            $b2h = bin2hex(mb_substr($text, $a, 1));
            $s .= mb_substr($text, $a, 1) . '=' . $b2h . "\n";
        }
        if (mb_strpos($text, 'формулы') !== false) die($s);
    }
    // << << <<

    // >> Преобразуем строку в HEX-представление
    $textHEX = '';
    for ($charIndex = 0; $charIndex < mb_strlen($text); $charIndex++) {
        $charHEX = bin2hex(mb_substr($text, $charIndex, 1));
        if ($charHEX == '0a') continue;//Символ переноса строки
        if ($charHEX == '0d') continue;//Символ переноса строки
        if ($charHEX == '09') $charHEX = '20';//Перобразовываем символ табуляции в символ пробела
        if ($charHEX == 'e28093') $charHEX = '2d';
        if (mb_substr($charHEX, 0, 2) == 'c2') {
            if (mb_substr($charHEX, 2, 4) != 'ab' && mb_substr($charHEX, 2, 4) != 'bb') {
                $charHEX = mb_substr($charHEX, 2);
            }
        }
        if ($charHEX == 'a0') continue;//Ненужный символ
        if (!in_array(mb_substr($charHEX, 0, 1), array('a','b','c','d','e','f'))) $charHEX = '00'.$charHEX;
        $textHEX .= $charHEX;
    }
    // << << <<

    // >> Преобразуем HEX-представление строки в строку букв
    $text = '';
    for ($charIndex = 0; $charIndex < mb_strlen($textHEX); $charIndex += 4) {
        $charHEX = mb_substr($textHEX, $charIndex, 4);
        if (mb_substr($charHEX, 0, 2) == '00') $charHEX = mb_substr($charHEX, 2);
        $text .= pack('H*', $charHEX);
    }
    // << << <<

    return $text;
}


Если кто подскажет более изящное решение - буду рад ;)
PM   Вверх
srt
Дата 2.7.2011, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.5.2008

Репутация: нет
Всего: 1



адрес сайта подскажи, на посмотреть
PM MAIL   Вверх
mark2011
Дата 7.7.2011, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 28.6.2011

Репутация: нет
Всего: 2



fridkaratel
Если тема актуальна - пересохрани файл php в кодировке UTF-8 без BOM.
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0709 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.