угадайте кодировку кодировки в PHP - PullRequest
1 голос
/ 25 июня 2011

Я пытаюсь написать свой собственный веб-сканер с помощью cURL на PHP.

[...]
mb_internal_encoding('UTF-8');
mb_language('uni');
$this->_curl = curl_init();
curl_setopt($this->_curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($this->_curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->_curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($this->_curl, CURLOPT_MAXREDIRS, 0);
curl_setopt($this->_curl, CURLOPT_TIMEOUT, 10);
curl_setopt($this->_curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10');
curl_setopt($this->_curl, CURLOPT_HEADER, true);
curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, true);
$header = array(
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3",
            "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
            "Keep-Alive: 115",
            "Connection: keep-alive",
);
curl_setopt($this->_curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($this->_curl, CURLOPT_URL, $url);
curl_setopt($this->_curl, CURLOPT_POST, false);
curl_setopt($this->_curl, CURLOPT_POSTFIELDS, array());
curl_setopt($this->_curl, CURLOPT_HTTPGET, true);
$page = curl_exec($this->_curl);
[...]

Проблема в кодировке сайта. Как вы можете видеть на

http://blog.163.com/drewes_4711/blog/static/179317021201151624826557/

есть заголовок "Content-Type: ...;charset=GBK", поэтому я могу сделать mb_convert_encoding($content, "UTF-8", "GBK");, но что мне делать с

http://tech.hexun.com/2011-06-21/130756909.html

Это , кажется, - это та же самая кодировка, но она не указана в заголовке HTTP. Так что у меня огромные проблемы с немецким умлаутом, китайским и азиатским языками ... Есть ли какой-нибудь модуль или фрагмент, который я могу использовать для определения кодировки ЛЮБОГО загруженного HTML-сайта с помощью cURL?

1 Ответ

2 голосов
/ 25 июня 2011

Эта вторая ссылка содержит:

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

Все данные до этого выглядят как простые ASCII.Таким образом, вы можете попробовать, если заголовки HTTP не дают подсказки, просто разбирая (при условии простого ASCII, а не UTF-8 - который может сломаться), пока не найдете этот заголовок.

Это явно не гарантируетсяработать.Если сервер не отправляет кодировку, и у страницы также нет этого заголовка, вам не повезло.Универсальных средств для обнаружения кодирования данного фрагмента данных не существует.

...