本当になんで文字コードなんてあるんだろうって思っちゃいますよね、UTF8以外すべて殺してしまえっ!と織田信長ばりに思わずにいられません。ここではPHPでスクレイピングしている時、文字化けがどうしても治らない時の治し方を書きます。ぼくの場合は素のPHPではなく、laravelというフレームワークでの文字化けでしたが素のPHPでも同じだと思うので参考にしてみてください。場合分けが大事!1PHPにあらかじめ入っているloadHTMLで文字化けしているのか2何かしらのスクレイピングライブラリ(もしくはHTMLパーサー)を使っていて文字化けが起こるのか3特定のサイトのみで文字化けが起こるのかまとめ場合分けが大事!文字化けが治らない時、一番大事なのが場合分けです。やられていると思いますが、PHPにあらかじめ入っているloadHTMLで文字化けしているのか何かしらのスクレイピングライブラリ(もしくはHTMLパーサー)を使っていて文字化けが起こるのか特定のサイトのみで文字化けが起こるのかここらへんを場合分けしていくと文字化けも直しやすくなります。1PHPにあらかじめ入っているloadHTMLで文字化けしているのかPHPはデフォルトでHTMLパーサー「loadHTML」が入っていて、これを使うとライブラリを入れなくてもPHP単体でスクレイピングができます。このloadHTMLは少々使いづらく、日本語が文字化けしやすい...みたいです。調べればわんさか文字化けの事例が出てきます。$html);どちらも4行目まで全く同じで5行目だけ違います。5行目で「UTF-8」の文字コードを設定してます。対象のウェブサイトがシフトJISなら「shift_jis」としてください。「Shift_JIS」や「SJIS」みたいな大文字表記でも行けましたが、一応ぼくの環境では小文字で安定して動いています。ちなみに両方のコードで共通の2行目と4行目でHTMLタグ読み込み時のエラーを無効化している(これがないとエラーで実行できない)ので、loadHTMLを使う場合はこの2行もつけてくださいね。2何かしらのスクレイピングライブラリ(もしくはHTMLパーサー)を使っていて文字化けが起こるのかphpにはいくつかスクレイピング用の便利なライブラリがありますよね。「Goutte」が更新されなくなったんで、今だと「Guzzle」+Symfonyの「DomCrawler」とかでスクレイピングしてる方が多いのかもしれません。いうスクレイピングライブラリを使っていて文字化けが発生したなら、いったん1のようなライブラリを使わない方法、それから他のスクレイピングライブラリでも同じく文字化けが発生しちゃうのか見てみるのがいいです。発生するのであればPHPのかなり深い所で文字化けが発生している(例えばcurlとか)か、もしくは次項の話になりますが、そのスクレイピングしたいサイト特有のどデカい原因があるのか、という事になります。3特定のサイトのみで文字化けが起こるのか僕の場合、今回このケースでした。特定の1サイトのみ文字化けが発生し続ける、という。僕も最初、2で書いたようにGuzzleとDomCrawlerを組み合わせてスクレイピングしててそれで文字化け、場合分けするために1のloadHTMLを使ってみても文字化け...、でcurlか対象サイト自体の問題を疑うに至る、というながーいハマりでした(さらにいうと他言語でも試していてPythonでやってみたらちゃんとスクレイピングできちゃうというのもモヤモヤ)。charset="utf-8">」を信じない、というのが大事だと思います。結局、今回僕がハマった文字化けの場合、タグで宣言されてる文字コードとそのファイルをサーバーにアップロードした際の保存形式としての文字コードが違ったのが原因で文字化けしてました。わかりやすく書くと「WEBデザイナーのミス」という事です。1の方法で「UTF-8」になってる所を他の文字コード「shift_jis」とか「EUC-JP」に変更してみてください。type」とかからそのサイトの文字コードを自動取得するんですが、それと実際のファイルの保存形式が違ったらそりゃ文字化けしちゃうよね、という事でした。「PHP君:スクレイピングしちゃうぞっ!よしっ、このサイトはメタタグにUTF-8って書いてあるからこれで解析していくぞっ!」「実際のファイル君:ふっふーん、ぼくタグではUTF-8って言ってるけれど実際の保存形式はSJISなんですよねぇ...」という罠。まとめPHPでスクレイピングをしている時に文字化けしちゃうときの治し方をケースごとに書きました。loadHTMLは文字化けしやすいんで、PHPでスクレイピングするならGuzzleとDomCrawlerのライブラリを使うのがいいんだけれど、サイトの制作者の保存ミス?によってはライブラリを使っていても普通に文字化けするんで、メタタグを信じないようにしよう!という感じ。参考にしてみてくださいね。