fgetcsvの不具合
9月 5th, 2007 tocmoc2008.4.28 修正
----
PHPでcsvを読み込む場合,fgetcsvという関数が提供されているので,これを使うと楽だ.
しかし,ソフトによってはCSVを保存すると,ファイルの先頭に自動的にBOM(Byte Order Mark)が付与される場合がある.BOMは,ファイルのエンコーディングスキームを認識するためのもので,ファイルの先頭にそのための識別子を記述しておく.というものだ.
UTF-16であれば,BOMは先頭2バイトにデータが付与され,
UTF-8の場合は,BOMは先頭3バイトにデータが付与される.
UTF-16LE(Little Endian)
FF FE
UTF-16BE(Big Endian)
FE FF
UTF-8
EF BB BF
PHPでCSVの処理をする場合,fgetcsvを使っていると,このBOMのせいでデリミタや二重引用符がうまく処理できない場合がある.私の場合は,データ先頭の二重引用符が二重に処理されてしまった.
"1","2","3","4"......
のはずが,
""1"","2","3","4"......
となってしまった
対処法としては,BOMを削除したファイルを作るか,PHPのプログラム内でBOMを検出して読み飛ばすようなコードを書けば良いということになる.
ファイルを指定してBOMを削除するフリーソフト
non-BOM
■ http://www.vector.co.jp/soft/win95/util/se218158.html
PHPプログラム内で自力でどうにかしたい場合には,fegtcsvに入れる前にファイルポインタの先頭3文字をチェックしておく.
使う時には,次のような感じ