細かくチェックすることって大事だなぁ、と言う話。
仕事でヤフーオークションのデータをスクレーピングすることになったのだが、EUC-JPからUTF-8に変換するのに機種依存文字が文字化けしてこまった。ググッた結果eucwin-jpで処理すればいいらしい。とかあったのだがダメだった。結局、内部エンコーディング確認したり、mb_detect_encoding()の変換結果を確認しながらパズルのように試してたら、出来た。みたいな腑に落ちない結果です。
環境
- 取得する側のエンコードはEUC-JPとなっている。
- スクレーピングした結果はUTF-8でDBへ保存する必要がある。
- PHP設置場所はKAGOYA Internet Routing
コード
<?php // ページのエンコードはUTF-8 header("Content-Type: text/html; charset=UTF-8"); // 対象となる文字列(すでに文字化けしてますが・・) $str = '∩*m左は機種依存文字記号です。'; echo '<p>'.$str.'<br>'; echo 'エンコーディングは'.mb_detect_encoding($str).'です</p>'; // 'EUC-JP'から'UTF-8'へ変換 $str_euc = mb_convert_encoding($str, 'SJIS-win', 'EUC-JP' ); echo '<p>'.$str_euc.'<br>'; echo 'エンコーディングは'.mb_detect_encoding($str_euc).'です</p>'; // 'EUC-JP'から'UTF-8'へ変換 $str_euc = mb_convert_encoding($str_euc, 'UTF-8', 'SJIS-win' ); echo '<p>'.$str_euc.'<br>'; echo 'エンコーディングは'.mb_detect_encoding($str_euc).'です</p>'; $encoding = mb_internal_encoding(); // 内部エンコーディングを確認してみた echo '<p>内部エンコーディングは'.$encoding.'です。</p>'; ?>
結果
∩*m左は機種依存文字記号です。 エンコーディングはUTF-8です <文字化けしてます> エンコーディングはSJISです ∩*m左は機種依存文字記号です。 エンコーディングはUTF-8です 内部エンコーディングはEUC-JPです。
備考
- いや、全く理由がわからん。SJIS-winをeucwin-jpにしてもダメだった。誰か理由を教えてください。