simplexml_load_string()のparser errorがutf8エンコードしても解決できない⇒原因は圧縮データがfile_get_contents()で文字化けしてた

Change Language▸English
simplexml_load_string()で久々にドハマりして、最終的に物凄くサクッと解決策が分かったので覚書。

simplexml_load_string()でparser errorが解決しない

こんな感じでエラーが出て、二進も三進も行かないわけですよ。
Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in test.php on line XXX
一応この手のエラーメッセージに対する回答は「utf8_encode()使え」が大半。
それなのに、何をやっても解決しない!

utf8エンコードを手あたり次第試してみる

utf8_encodeもダメ。
$file = utf8_encode ( $file );
mb_convert_encodingもダメ。
$file= mb_convert_encoding($file, 'UTF-8', mb_detect_encoding($file, 'UTF-8', true));
var_dump()したら文字化けがずらずらッと出てくる……おかしい、なにこのXML。
ダウンロードして見る限り普通のファイルなんだけどなぁ。

原因はその直前のfile_get_contents()か?

そもそもfile_get_contentsが上手くいってないのか?と思ってcurl使ってみるも、結果は全く変わらず。
どういうこと……?
もしかして
「file_get_contentsで取得したデータ」のエンコードが分からなくて出力時に文字化けしてる
のではなく
「取得時点でデータがそもそも文字化けしてる」
のか?

file_get_contents()の文字化けは圧縮が原因だった!!!

日本語で検索したらダメダメなのに、英語検索したら一発でしたよ。
file_get_contentsで取ってきたデータが、gzip圧縮とかzlib圧縮だとこうなるんですって。
で、解決方法が超簡単!
file_get_contents('compress.zlib://http://example.com');
こんだけ!
なんと元々file_get_contentsしてたURLの前に「compress.zlib://」と付け加えるだけで、OKなのです!
さすがPHPやで!!

日本語検索してもmb_convert_encodingネタばっかり出てきてなんのヒントにもならなかったけど、圧縮データだって分かったら速攻で解決してしまった……。
皆さんも困ってたら是非試して見て下さい。
そして無事解決出来たら情報共有するべし。
カテゴリ:PHP 
 @nwsweb