PHP Curl UTF-8 Charset
У меня есть php script, который вызывает другую веб-страницу и записывает все 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);
Ответы
Ответ 1
Простой:
Когда вы используете curl, он кодирует строку в utf-8
, вам просто нужно их декодировать.
Description
string utf8_decode ( string $data )
Эта функция декодирует данные, которые считаются utf-8
закодированными, до ISO-8859-1
.
Ответ 2
Вы можете использовать заголовок
header('Content-type: text/html; charset=UTF-8');
и после строки декодирования
$page = utf8_decode(curl_exec($ch));
Это сработало для меня
Ответ 3
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;
}
Ответ 4
$output = curl_exec($ch);
$result = iconv("Windows-1251", "UTF-8", $output);
Ответ 5
Первый метод (внутренняя функция)
Лучший способ, который я пробовал раньше, это использовать urlencode()
. Имейте в виду, не используйте его для всего URL; вместо этого используйте это только для необходимых частей. Например, запрос, который имеет два поля 'text-fa' и 'text-en' и содержит текст на персидском и английском языках, соответственно, вам может потребоваться только кодировать персидский текст, а не английский.
Второй метод (с использованием функции cURL)
Однако, есть лучшие способы, если диапазон символов должен быть закодирован более ограниченным. Один из этих способов - использовать CURLOPT_ENCODING
, передав его в curl_setopt()
:
curl_setopt($ch, CURLOPT_ENCODING, "");
Ответ 6
Я извлекал файл с кодировкой windows-1252 через cURL, а mb_detect_encoding(curl_exec($ch));
возвращал UTF-8. Пробовал utf8_encode(curl_exec($ch));
, и символы были правильными.