文字化け解消?
投稿日: 2007-11-16 /
カテゴリー:job
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