2011-06-25 3 views
1

PHPでcURLを使用して独自のWebクローラーを作成しようとしています。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で調べるために使用できるモジュールやスニペットはありますか?

答えて

2

第2のリンクが含まれていること:それはプレーンなASCIIのように見える

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

すべてのデータの前に。したがって、ヘッダーが見つかるまで、HTTPヘッダーが手がかりを与えていない場合、解析するだけです(単純なASCIIで、UTF-8ではなく、破損する可能性があります)。

これは明らかに動作するとは限りません。サーバーがエンコーディングを送信せず、そのページにそのヘッダーもない場合、あなたは不運です。与えられたデータのエンコーディングを検出する普遍的な手段はありません。

+0

@ mu、@ Mat:素晴らしい。私は知らない、なぜ私はこれを自分で探していないのですか?しかし、「Accept-Charset:utf-8」を送信したときに、コンテンツがUTF-8であると仮定するのは正しいことではなく、ヘッダーやコンテンツにコンテンツタイプが見つかりませんか? – rabudde

+0

理想的な世界では、この問題は本当にありません。しかし、あなたのアプリが標準設定に準拠したウェブサーバやページを適切に設定している場合には、欠けてしまうものがたくさんあります:-) – Mat

+0

確かに。私は 'mb_check_encoding($ string、 'UTF-8')'でチェックします。そうでなければ、 'utf8_encode($ string)'を実行します。 – rabudde