Hatena::ブログ(Diary)

日記

2007-11-16 晴れ

[]文字化け解消?

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-JPUTF-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

[]「有閑倶楽部(7)」(一条ゆかり

有閑倶楽部 (7) (集英社文庫―コミック版)

有閑倶楽部 (7) (集英社文庫―コミック版)

R・田中いきりょう…。(古い。)

鬼と悠理の母ちゃんとどっちが怖いだろうか。

すももすもも 2007/12/26 13:24 助かりましたT.T ありがとうございます。

keukokeuko 2008/03/28 00:03 いえいえ、恐縮です。お役に立てて幸いです。

トラックバック - http://d.hatena.ne.jp/keuko/20071116