어제 예전에 만들었던 China Weather Network의 날씨 API가 로컬에 저장되어 있고 일부 도시가 깨져 있는 것을 발견했습니다.
아직도 이유를 찾을 수 없습니다. 브라우저에서는 완전히 정상적으로 보이기 때문입니다. 좋다. 인촨의 오늘의 날씨를 읽어보세요 http://m.weather.com.cn/data/101170101.html
에서 json 데이터를 보는 것은 완전히 정상입니다. 브라우저. 인코딩도 정상입니다. 그러나 file_get_contents를 사용하여 브라우저에서 출력을 읽으면 왜곡됩니다.
<span>$url</span> = 'http://m.weather.com.cn/data/101170101.html'<span>; </span><span>echo</span> '<pre class="brush:php;toolbar:false">'<span>; </span><span>print_r</span>(<span>file_get_contents</span>(<span>$url</span>));
한동안 온라인으로 바빴는데 그 이유는 중국 기상청이 gzip 압축을 켜놨기 때문이라는 것을 알게 되었습니다. http://www.php10086.com/2012/03/516.html
PHP의 file_get_contents에서 원격 페이지 콘텐츠를 가져옵니다. gzip으로 인코딩된 경우 반환된 문자열은 인코딩된 문자열입니다. gzip 문제를 해결하는 두 가지 방법은 다음과 같습니다.
<span>function</span> curl_get(<span>$url</span>, <span>$gzip</span>=<span>false</span><span>){ </span><span>$curl</span> = curl_init(<span>$url</span><span>); curl_setopt(</span><span>$curl</span>, CURLOPT_RETURNTRANSFER, 1<span>); curl_setopt(</span><span>$curl</span>, CURLOPT_CONNECTTIMEOUT, 10<span>); </span><span>if</span>(<span>$gzip</span>) curl_setopt(<span>$curl</span>, CURLOPT_ENCODING, "gzip"); <span>//</span><span> 关键在这里</span><span>$content</span> = curl_exec(<span>$curl</span><span>); curl_close(</span><span>$curl</span><span>); </span><span>return</span><span>$content</span><span>; }</span>
gzip 인코딩 형식 채택
<span>file_get_contents</span>("compress.zlib://".<span>$url</span>);
위 코드는 페이지가 gzip으로 압축되었는지 여부에 관계없이 작동합니다!
PHP 4.3.0 이상에서 지원되며 fopen과 같은 기능에도 사용 가능합니다~!
해결책:
<span>$url</span> = 'http://m.weather.com.cn/data/101170101.html'<span>; </span><span>echo</span> '<pre class="brush:php;toolbar:false">'<span>; </span><span>print_r</span>(<span>file_get_contents</span>("compress.zlib://".<span>$url</span>));<span>//</span><span>打开gzip压缩过的页面。 路径前不加compress.zlib:// 打开会有乱码。 </span>
위 내용은 내용을 포함하여 gzip 압축으로 인해 발생하는 원격 파일을 읽는 PHP file_get_contents의 왜곡된 문제를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.