文字化け解消?

Excel_Reviserという、phpからExcelのレイアウトファイルにデータを出力できるツールを使っています。
データもソースファイルも文字コードEUC-JPです。
髙(はしごたか)が「?」に化けたり、鰣(はす、と読むらしいです)という文字が実体参照の表記(& #39971;)でそのまま出力されたりしていやんだったので試行錯誤した結果、なんとかなりました。とりあえず。(まだ化ける字があるのは確認済みなんですが。)


せっかくなんで何をしたかを書いておきます。参考になれば幸いですが、責任はとれません。よしなに。


変換処理をデータをセットするところにかませたかったので、ラッパークラスを作成しました。
ちなみにaddString()しか使ってないのでそれしか対応してません。あとは知らん。(←ひどいよ。)
以下は作ったラッパークラス(の抜粋)。


require_once('reviser.php');
class myreviser extends Excel_Reviser {

public function __construct() {
parent::__construct();
// 文字コードのセット
parent::setInternalCharset('eucJP-win');
}
public function __destruct() {
parent::__destruct();
}

function addString($sheet,$row, $col, $str, $refrow = null, $refcol = null, $refsheet = null){
// データを変換
$str = $this->ConvertEncodingForUTF8($str);
$str = $this->nument2chr($str);

// 本体を呼び出し
parent::addString($sheet,$row, $col, $str, $refrow, $refcol, $refsheet);
}

/**
* 文字コード変換(EUC-JP→UTF-8で化ける文字対応)
*/
private function ConvertEncodingForUTF8($data) {
$data = mb_convert_encoding($data, 'sjis-win', 'EUC-JP');
$data = mb_convert_encoding($data, 'eucJP-win', 'sjis-win');
return $data;
}

/**
* 実体参照を文字に変換
*/
private function nument2chr($str) {
if ($str != '') {
$map = array(0, 0x10FFFF, 0, 0xFFFFFF);
$str = mb_decode_numericentity($str, $map, 'eucJP-win');
}
return $str;
}
}

ポイントは文字コードに「eucJP-win」を指定するところと、データをいったん「sjis-win」に変換してからさらに「eucJP-win」に変換するところですかね。
なんでこれで上手くいくのかよく分からないんですが、これじゃないとだめだったのです。



実体参照を文字に変換するところは以下のページを参考にさしていただきました。
http://bmky.net/diary/log/881.html