Доброго времени суток! Помогите пожалуйста определить кодировку и перекодировать строку. Изначально задача была с помощью simplexml_load_file парсить xml файл: Код (Text): $sxml = simplexml_load_file('http://logs.dozory.ru/2014-06-04/28886903.xml'); print_r($sxml); но в результате получил только ошибки: Код (Text): 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 Warning: simplexml_load_file() [function.simplexml-load-file]: �cE�S on line 5 Warning: simplexml_load_file() [function.simplexml-load-file]: ^ on line 5 Символы во второй ошибке натолкнули на мысль что, какие-то проблемы с кодировками, применил file_get_contents, вывел полученную строку, и вот что получил: Вроде-бы это us-ascii, но перекодировать строку в читаемый вид с помощью iconv не получается. Онлайн сервисы перекодировки, также не справились, да и исходную кодировку некоторые из них определяли по разному. Примечательно, что если просто открыть исходный xml в браузере то всё будет читаемо. Пробовал менять кодировки у себя, применять cUrl, копировать файл fopen/fwrite, эмулировать браузер с помощью библиотеки snoopy - ничего не помогло, всё время получаю кодированную строку. По всему выходит что нужно менять кодировку на том хосте где лежит xml, но он не мой, и изменить я там ничего не могу... Буду благодарен за любые идеи, которые помогут решить эту проблему.
Для определения кодировки, которая неизвестна заранее, можно воспользоваться штатной функцией mb_detect_encoding() Если кодировка данных в xml-файле отличается от utf-8 то её объявление должно следовать в самом файле после указания версии разметки, что является требованием стандарта Код (Text): <?xml version='1.0' encoding='windows-1252'...
mb_detect_encoding как-то странно работает - определяет символ � как кодировку utf-8... и я не много погуглил почему так, и нашел достаточно много упоминаний о том что эта функция не всегда корректно определяет кодировку Да, в xml стоит кодировка koi8-r, и как я писал выше если открыть xml в браузере, то он будет корректно отображаться в кодировке koi8-r. Но при попытке обращения к файлу любым другим способом из тех что я пробовал, на выходе получаем строку в непонятной кодировке. И кстати я пытался вытащить файл не только через php скрипт, но и при помощи программы Teleport pro, и на выходе получал всё тот же набор символов.
Проблема не в кодировке ))) По указанному URL отдается gzip-ованый контент. Браузер с этим справляется автоматически, а в скрипте придется кое-что делать "ручками". Добавлено спустя 2 минуты 46 секунд: Код (PHP): <?php $filename = 'http://logs.dozory.ru/2014-06-04/28886903.xml'; $f = gzopen($filename, 'r'); $data = gzread($f, 10000); gzclose($f); $sxml = simplexml_load_string($data); print_r($sxml);