У меня есть php-скрипт, который вызывает другую веб-страницу и записывает все html страницы, и все идет нормально, но проблема с кодировкой. Моя кодировка php-файлов – это utf-8, и все остальные php-файлы работают нормально (это означает, что на сервере нет проблем). Какая недостающая вещь в этом коде и все испанские буквы выглядят странно. PS. Когда я написал эти странные символы в версии для php, все они выглядят точными.
header("Content-Type: text/html; charset=utf-8"); function file_get_contents_curl($url) { $ch=curl_init(); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); $data=curl_exec($ch); curl_close($ch); return $data; } $html=file_get_contents_curl($_GET["u"]); $doc=new DOMDocument(); @$doc->loadHTML($html);
Простой: когда вы используете curl, он кодирует строку в utf-8
вам просто нужно их декодировать.
Description string utf8_decode ( string $data )
Эта функция декодирует данные, предполагаемые UTF-8
, в ISO-8859-1
.
Вы можете использовать заголовок
header('Content-type: text/html; charset=UTF-8');
и после строки декодирования
$page = utf8_decode(curl_exec($ch));
Это сработало для меня
function page_title($val){ include(dirname(__FILE__).'/simple_html_dom.php'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$val); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0'); curl_setopt($ch, CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $return = curl_exec($ch); $encot = false; $charset = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); $html = str_get_html('"'.$return.'"'); if(strpos($charset,'charset=') !== false) { $c = str_replace("text/html; charset=","",$charset); $encot = true; } else { $lookat=$html->find('meta[http-equiv=Content-Type]',0); $chrst = $lookat->content; preg_match('/charset=(.+)/', $chrst, $found); $p = trim($found[1]); if(!empty($p) && $p != "") { $c = $p; $encot = true; } } $title = $html->find('title')[0]->innertext; if($encot == true && $c != 'utf-8' && $c != 'UTF-8') $title = mb_convert_encoding($title,'UTF-8',$c); return $title; }
$output = curl_exec($ch); $result = iconv("Windows-1251", "UTF-8", $result);
Я mb_detect_encoding(curl_exec($ch));
файл с кодировкой windows-1252 через cURL и mb_detect_encoding(curl_exec($ch));
вернулся UTF-8. Пробовал utf8_encode(curl_exec($ch));
и символы были правильными.
Лучшим способом, который я пробовал раньше, является использование urlencode()
. Имейте в виду, не используйте его для всего URL-адреса. Используйте его только для частей, которые вам нужны, например, для персидских символов. Однако есть лучшие способы, если диапазон символов, которые вы хотите кодировать, более ограничен. Один из этих способов – использовать CURLOPT_ENCODING
, перейдя к другому curl_setopt()
:
curl_setopt($ch, CURLOPT_ENCODING, "");