LeagueCSV でsjisのCSVを読むときの地雷
LeagueCSV は php でCSVを読み書きする時にとても便利である。
だが、内部エンコーディングと違うエンコーディングのものを読もうとする時に一つ地雷(バグ)が埋まっている。
$reader = Reader::createFromPath(ファイル名, 'r');
$reader->setHeaderOffset(0);
CharsetConverter::addTo($reader, 'SJIS-win', 'UTF-8');
一見、ちゃんと動く。ところが、時々変な箇所がピンポイントで文字化けしてしまう。
しばらく悩んだところで気づいた。マルチバイトの文字を泣き別れにしてね?固定長バッファで読むだけ読んで、マルチバイト文字の境界にぶち当たってもしれっと変換して終わりにしてないか?
試しに
$reader = Reader::createFromString(mb_convert_encoding(file_get_contents(ファイル名), 'UTF-8', 'SJIS-win'));
$reader->setHeaderOffset(0);
こうしてみた。ものの見事に治った
やれやれ。
Readerで使うのはダメだな。Writerでも、行単位でバッファフラッシュさせないと(スレッショルドを1にしないと)だめかもしれない。