Собственно Вам удаленный сайт уже и так всё говорит, почему бы не учесть то, что он говорит?
1. Заглядываем в заголовки HTTP ответа, видим:
Content-Type:text/html; charset=UTF-8
2. Заглядываем в контент страницы, видим:
<meta charset="UTF-8" />
3. Есть еще один метод подсказать кодировку:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Решение - смотрим, чего нам говорят, подставляем в качестве параметра для iconv, но не забываем дефолтное значение на всякий случай.
Вариант решения - если сайтов в ограниченное количество, храните где-то предпочитаемую кодировку.
Фрагмент на python, реализующий автоматическое декодирование на основании заголовка ответа:
encoding='utf-8' # кодировка по умолчанию
tmp = r.headers.get('Content-Type').split('=') #режем по =, что справа - кодировка
if len(tmp)>1: #если кодировка в заголовке есть - будет 2 элемента
encoding=tmp[-1] # тогда берём последний
page = r.content.decode(encoding)
Итоговый ответ:<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $engine_url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
....
//дополнить этим:
curl_setopt($ch, CURLOPT_HEADER, 1);
$tmpResult = curl_exec($ch);
$header_size = curl_getinfo($ch,CURLINFO_HEADER_SIZE);
curl_close($ch);
$tmpHeaders = substr($tmpResult, 0, $header_size);
$postResult = substr($tmpResult, $header_size);
$headers = array();
foreach(explode("\n",$tmpHeaders) as $header)
{
$tmp = explode(":",trim($header),2);
if (count($tmp)>1)
{
$headers[strtolower($tmp[0])] = trim(strtolower($tmp[1]));
}
}
$encoding="utf-8"; //default
if (isset($headers['content-type']))
{
$tmp = explode("=", $headers['content-type']);
if (count($tmp)>1) $encoding = $tmp[1];
}
if ($encoding != "utf-8") $postResult = iconv($encoding, "UTF-8", $postResult);
Всё. Получаем расширенный ответ, который содержит заголовки. Вырезаем из него заголовки и режем их в массив, плюс достаём тело ответа.
Парсим заголовки http, вытаскиваем content-type и из него вытаскиваем кодировку