За последние 24 часа нас посетили 20078 программистов и 1723 робота. Сейчас ищет 1791 программист ...

Помогите разобраться с кодировкой

Тема в разделе "Сделайте за меня", создана пользователем r22d22, 19 июн 2014.

  1. r22d22

    r22d22 Новичок

    С нами с:
    19 июн 2014
    Сообщения:
    3
    Симпатии:
    0
    Доброго времени суток!
    Помогите пожалуйста определить кодировку и перекодировать строку. Изначально задача была с помощью simplexml_load_file парсить xml файл:
    Код (Text):
    1. $sxml = simplexml_load_file('http://logs.dozory.ru/2014-06-04/28886903.xml');
    2. print_r($sxml);
    но в результате получил только ошибки:
    Код (Text):
    1. Warning: simplexml_load_file() [function.simplexml-load-file]: http://logs.dozory.ru/2014-06-04/28886903.xml:1: parser error : Start tag expected, '<' not found on line 5
    2. Warning: simplexml_load_file() [function.simplexml-load-file]: �cE�S on line 5
    3. Warning: simplexml_load_file() [function.simplexml-load-file]: ^ on line 5
    Символы во второй ошибке натолкнули на мысль что, какие-то проблемы с кодировками, применил file_get_contents, вывел полученную строку, и вот что получил:
    Вроде-бы это us-ascii, но перекодировать строку в читаемый вид с помощью iconv не получается. Онлайн сервисы перекодировки, также не справились, да и исходную кодировку некоторые из них определяли по разному.
    Примечательно, что если просто открыть исходный xml в браузере то всё будет читаемо.
    Пробовал менять кодировки у себя, применять cUrl, копировать файл fopen/fwrite, эмулировать браузер с помощью библиотеки snoopy - ничего не помогло, всё время получаю кодированную строку.
    По всему выходит что нужно менять кодировку на том хосте где лежит xml, но он не мой, и изменить я там ничего не могу...
    Буду благодарен за любые идеи, которые помогут решить эту проблему.
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Для определения кодировки, которая неизвестна заранее, можно воспользоваться штатной функцией mb_detect_encoding()

    Если кодировка данных в xml-файле отличается от utf-8 то её объявление должно следовать в самом файле после указания версии разметки, что является требованием стандарта
    Код (Text):
    1. <?xml version='1.0' encoding='windows-1252'...
     
  3. r22d22

    r22d22 Новичок

    С нами с:
    19 июн 2014
    Сообщения:
    3
    Симпатии:
    0
    mb_detect_encoding как-то странно работает - определяет символ � как кодировку utf-8... и я не много погуглил почему так, и нашел достаточно много упоминаний о том что эта функция не всегда корректно определяет кодировку

    Да, в xml стоит кодировка koi8-r, и как я писал выше если открыть xml в браузере, то он будет корректно отображаться в кодировке koi8-r. Но при попытке обращения к файлу любым другим способом из тех что я пробовал, на выходе получаем строку в непонятной кодировке.
    И кстати я пытался вытащить файл не только через php скрипт, но и при помощи программы Teleport pro, и на выходе получал всё тот же набор символов.
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Проблема не в кодировке ))) По указанному URL отдается gzip-ованый контент. Браузер с этим справляется автоматически, а в скрипте придется кое-что делать "ручками".

    Добавлено спустя 2 минуты 46 секунд:
    Код (PHP):
    1. <?php
    2.  
    3. $filename = 'http://logs.dozory.ru/2014-06-04/28886903.xml';
    4.  
    5. $f = gzopen($filename, 'r');
    6. $data = gzread($f, 10000);
    7. gzclose($f);
    8.  
    9. $sxml = simplexml_load_string($data);
    10. print_r($sxml);
    11.  
     
  5. r22d22

    r22d22 Новичок

    С нами с:
    19 июн 2014
    Сообщения:
    3
    Симпатии:
    0
    Огромное спасибо)