PHPで文字化けにハマる

細かくチェックすることって大事だなぁ、と言う話。

仕事でヤフーオークションのデータをスクレーピングすることになったのだが、EUC-JPからUTF-8に変換するのに機種依存文字が文字化けしてこまった。ググッた結果eucwin-jpで処理すればいいらしい。とかあったのだがダメだった。結局、内部エンコーディング確認したり、mb_detect_encoding()の変換結果を確認しながらパズルのように試してたら、出来た。みたいな腑に落ちない結果です。

環境

結果

コード

<?php
// ページのエンコードはUTF-8
header("Content-Type: text/html; charset=UTF-8");

// 対象となる文字列(すでに文字化けしてますが・・)
$str = '&#58084;&#58088;∩*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-wineucwin-jpにしてもダメだった。誰か理由を教えてください。