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ネタばっかり出てきてなんのヒントにもならなかったけど、圧縮データだって分かったら速攻で解決してしまった……。
皆さんも困ってたら是非試して見て下さい。
そして無事解決出来たら情報共有するべし。