php 擷取資料亂碼問題

來源:互聯網
上載者:User
file_get_contents 採集一個頁面的資料,擷取的資料是亂碼,已經使用了檢測編碼的方式,
檢測的是utf-8,我的頁面編碼也是utf-8,但是還是顯示亂碼,不知道為什麼

$url="xxx";$opts = array(   'http'=>array(     'user_agent' => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",  ) ); $context = stream_context_create($opts); $neirong = file_get_contents($url, false, $context); header("content-Type: text/html; charset=Utf-8");  ob_end_flush(); $encode = mb_detect_encoding($neirong, array("ASCII","UTF-8","GB2312","GBK","BIG5"));          echo $encode."
";if ($encode!="UTF-8"){ $neirong=mb_convert_encoding($neirong, "UTF-8", $encode); } echo $neirong;


$encode 輸出:utf-8
$neirong 輸出是亂碼
我的頁面編碼是utf-8


回複討論(解決方案)

...$neirong = file_get_contents($url, false, $context);echo base64_encode($neirong);

貼出結果

...$neirong = file_get_contents($url, false, $context);echo base64_encode($neirong);

貼出結果



是一篇文章,結果太長了,我貼一段吧

77u/ICAgIOiwjeeWlOahteaYlOaZhOixkeebqOaak++8jOmAveS6juWHkeS+k+WyqeeGmueeg+ebqOa0headremAv

$c = '77u/ICAgIOiwjeeWlOahteaYlOaZhOixkeebqOaak++8jOmAveS6juWHkeS+k+WyqeeGmueeg+ebqOa0headremAv';echo base64_decode($c);


諜疔?昔????,?於湊?岩????杭??
?有??啊。最後那?是因?你的base64 不完整。

$c = '77u/ICAgIOiwjeeWlOahteaYlOaZhOixkeebqOaak++8jOmAveS6juWHkeS+k+WyqeeGmueeg+ebqOa0headremAv';echo base64_decode($c);


諜疔?昔????,?於湊?岩????杭??
?有??啊。最後那?是因?你的base64 不完整。


正確的輸出應該是 “讓田樹新無語的是,這個六伯居然真的沒有這方面的意思。 ”
是亂碼啊

把?集的地址?出?。

把?集的地址?出?。



這個是採集資料地址
http://www.ziyouge.com/conbdhekbefiab

這個是它網站的顯示頁面
http://www.ziyouge.com/zy/4/4980/1333249.html

採集地址的資料不正常,但它的頁面顯示正常

需要??集的??做些?理才行。

=224){$result .= change(mb_substr($content,$i,3));$i=$i+3;}else{$result .= mb_substr($content,$i,1);$i=$i+1;}}echo $result;// ?理function change($str){$ignore = array('“','”','!','…',':',',',',');if(in_array($str, $ignore)){return $str;}$prefix = "%u";$postfix = "";    $str = iconv('UTF-8', 'UCS-2', $str);    $arrstr = str_split($str, 2);    $unistr = '';    for($i = 0, $len = count($arrstr); $i < $len; $i++) {        $tmp = hexdec(bin2hex($arrstr[$i]));$tmp = str_pad(dechex($tmp),4,'0',STR_PAD_LEFT);$tmp = decrypt(substr($tmp,2,2).substr($tmp,0,2));$unistr .= $prefix . $tmp . $postfix;    }return unescape($unistr);}// 解密function decrypt($d){$result .= str_pad(dechex(hexdec($d)-100),4,'0',STR_PAD_LEFT);return $result;}// ?中文function unescape($str) {      $ret = '';      $len = strlen ( $str );      for($i = 0; $i < $len; $i ++) {          if ($str [$i] == '%' && $str [$i + 1] == 'u') {              $val = hexdec ( substr ( $str, $i + 2, 4 ) );              if ($val < 0x7f)                  $ret .= chr ( $val );              else if ($val < 0x800)                  $ret .= chr ( 0xc0 | ($val >> 6) ) . chr ( 0x80 | ($val & 0x3f) );              else                  $ret .= chr ( 0xe0 | ($val >> 12) ) . chr ( 0x80 | (($val >> 6) & 0x3f) ) . chr ( 0x80 | ($val & 0x3f) );              $i += 5;          } else if ($str [$i] == '%') {              $ret .= urldecode ( substr ( $str, $i, 3 ) );              $i += 2;          } else              $ret .= $str [$i];      }      return $ret;  }   ?> 



已經是晚上十一點了,路邊的拍檔基本?什麼人了,不過還有三貨依然喝的興高采烈的,而且大有不幹到天明,誓不罷休的意思,

fdipzone ,用你的方法還是輸出的亂碼,對解密不太瞭解

你在?出的html中加入

它源??是做了些??的,我那?程式已?是????了。

我把?集的也?出?,直接?行就可以了。

 $v ) {      $headerArr[] = $n .':' . $v;   }$ch = curl_init();curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPHEADER , $headerArr );  //構造IPcurl_setopt($ch, CURLOPT_REFERER, 'http://www.ziyouge.com/');   //構造來路$content = curl_exec($ch);$content = substr($content,3);if($error=curl_error($ch)){die($error);}curl_close($ch);// 剖析器$result = '';$str_length = mb_strlen($content);$i=0;while ($i<=$str_length){$temp_str=mb_substr($content,$i,1);$ascnum=Ord($temp_str);if ($ascnum>=224){$result .= change(mb_substr($content,$i,3));$i=$i+3;}else{$result .= mb_substr($content,$i,1);$i=$i+1;}}echo '';echo $result;// ?理function change($str){$ignore = array('“','”','!','…',':',',',',');if(in_array($str, $ignore)){return $str;}$prefix = "%u";$postfix = "";    $str = iconv('UTF-8', 'UCS-2', $str);    $arrstr = str_split($str, 2);    $unistr = '';    for($i = 0, $len = count($arrstr); $i < $len; $i++) {        $tmp = hexdec(bin2hex($arrstr[$i]));$tmp = str_pad(dechex($tmp),4,'0',STR_PAD_LEFT);$tmp = decrypt(substr($tmp,2,2).substr($tmp,0,2));$unistr .= $prefix . $tmp . $postfix;    }return unescape($unistr);}// 解密function decrypt($d){$result = str_pad(dechex(hexdec($d)-100),4,'0',STR_PAD_LEFT);return $result;}// ?中文function unescape($str) {      $ret = '';      $len = strlen ( $str );      for($i = 0; $i < $len; $i ++) {          if ($str [$i] == '%' && $str [$i + 1] == 'u') {              $val = hexdec ( substr ( $str, $i + 2, 4 ) );              if ($val < 0x7f)                  $ret .= chr ( $val );              else if ($val < 0x800)                  $ret .= chr ( 0xc0 | ($val >> 6) ) . chr ( 0x80 | ($val & 0x3f) );              else                  $ret .= chr ( 0xe0 | ($val >> 12) ) . chr ( 0x80 | (($val >> 6) & 0x3f) ) . chr ( 0x80 | ($val & 0x3f) );              $i += 5;          } else if ($str [$i] == '%') {              $ret .= urldecode ( substr ( $str, $i, 3 ) );              $i += 2;          } else              $ret .= $str [$i];      }      return $ret;  }   ?> 

你在?出的html中加入

它源??是做了些??的,我那?程式已?是????了。

我把?集的也?出?,直接?行就可以了。

[/code]



出現亂碼是因為php版本不同,我在5.3.28測試正常,在PHP 6.0.0-dev 中測試就是亂碼,是不是PHP 6.0.0-dev缺少了什麼組件

可能吧,dev版。。

可能吧,dev版。。


本地 5.3.28正常,換到伺服器5.3.28又出現亂碼了。。。
liunx的環境 ,本地是 ubuntu,伺服器是Debian

估??php mb string 的版本有?。
?境??只能靠你自己?理了,我???有??多?境。

估??php mb string 的版本有?。
?境??只能靠你自己?理了,我???有??多?境。


已經發現問題所在。不同平台下
$str = iconv('UTF-8', 'UCS-2', $str); //這句輸出的結果不同
//例如:$str="?"; $str = iconv('UTF-8', 'UCS-2', $str);正常的結果是“V^”;不正常的結果是“^V”;請教這個該怎麼解決

找到方法了。。不同平台轉換的usc-2編碼不同
對於 UCS-2, linux 下預設是 UCS-2BE。用iconv(指定UCS-2)來轉換產生的是 UCS-2BE 的 unicode。如果轉換windows平台過來的 UCS-2, 需要指定 UCS-2LE。



$str = iconv('UTF-8', 'UCS-2', $str);
改?
$str = iconv('UTF-8', 'UCS-2LE', $str);

就可以了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.