За последние 24 часа нас посетили 17610 программистов и 1610 роботов. Сейчас ищут 2170 программистов ...

Проблемы с кодировкой в file_get_contents

Тема в разделе "Прочие вопросы по PHP", создана пользователем letexa, 2 авг 2012.

  1. letexa

    letexa Активный пользователь

    С нами с:
    25 ноя 2010
    Сообщения:
    13
    Симпатии:
    0
    В цикле с помощью file_get_contents() загружаю около 100 страниц с внешнего сайта и некоторые из них возвращаются в виде кракозябров вот такого типа
    Код (Text):
    1.  
    2. ‹мY[oЫЦћ?Е)ѓVvm‰’_"KкЫY3$m`{Љў((сXўM‘*IЩqТ|·^^Љ¶KљmШЫE6V2iIоЪb–эО9¤n–\w+°=L†m^юзї+ыЪъ»kЫпЭЫ ooЯЅCоэожќЫkDЉЛтжЧdy}{]јёћH’mK1lНСLCСeyг)?•e/уЩ·7VЧqгhЋNуwЁб( «–!џ‘o‚NЗу2дiГ;v»nл
    Причем, если скрипт запустить ещё раз, может быть такое, что страница, которая раньше была с кракозябрами вернулась в нормальном html формате, а которая была в нормальном формате теперь в кракозябрах. Че за дела? Выставил паузу между загрузками страниц, не помогло. Может у кого есть мысли по этому поводу.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    Похоже это gzip-ованая версия страницы. Используй CURL или свой обработчик который будет заголовки просматривать.
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Заголовки ответа можно довольно просто посмотреть и при обычном file_get_contents:
    Код (PHP):
    1. <?php
    2. // ...
    3. $content = file_get_contents($site_url);
    4. print_r($http_response_header);
    5. // ...
    6. ?>
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    а кто сказал что что нельзя или сложно? )))
     
  5. letexa

    letexa Активный пользователь

    С нами с:
    25 ноя 2010
    Сообщения:
    13
    Симпатии:
    0
    Ясненько, попробую предложенные варианты. Если я правильно понял, надо просмотреть заголовки и, если окажется gzip, распаковать его. Поправьте если не так.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
  7. letexa

    letexa Активный пользователь

    С нами с:
    25 ноя 2010
    Сообщения:
    13
    Симпатии:
    0
    Задача решилась. Действительно дело было из-за архивов. Проверяем заголовки, если архив, открываем и читаем. В моем случае получился такой код:
    Код (Text):
    1.  
    2. if(isset($http_response_header[6]) and $http_response_header[6] == "Content-Encoding: gzip") {
    3. $html = "";
    4. $fp = gzopen($file, "r");
    5.   while (!gzeof($fp)) {
    6.     $buffer = gzgets($fp, 4096);
    7.     $html .= $buffer;
    8.           }
    9.    gzclose($fp);                                   
    10. }
    Спасибо artoodetoo за идею и sobachnik за просмотр заголовков!
     
  8. Shadow_rps

    Shadow_rps Активный пользователь

    С нами с:
    18 авг 2012
    Сообщения:
    2
    Симпатии:
    0
    Warning: gzopen(http://lenta.ru/): failed to open stream: HTTP request failed! <html> in C:\www\index.php on line 28
    чем лечить?
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Первый параметр должен быть имя файла.
     
  10. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0