Results > Posts Filed Under > PHP

Jan 25

PHP5 の fgetcsv() で読み込み内容が腐る現象

5

こんどは、PHP5.1.2 の fgetcsv() ではまった…

fgetcsv() で読み込もうとする csv ファイルの文字コードと、PHP の内部文字エンコーディングが違う場合、fgetcsv() で読み込むと、どうしても文字が腐る …
(PHP4 時代[少なくとも 4.3 系統は]は、問題なかった)

【以下みたいな場合】

  • CSV: Shift_JIS (Windows の Excel で作成されることを想定するとこれ)
  • PHP内部コード: UTF-8 (最近は自分プロジェクトはこれで統一している)

で、試しに、CSV のエンコードを UTF-8 にして試すと、うまくいんだよなぁ。

色々調べると、PHP5 からどうやらロケール? に左右されるらしい… (参照URL: PHP-devML)

ただ、上記 ML のスレッドでも解決方法(いや解決してないようだが)を試しても、やっぱりダメ。
なら、PHP を ShiftJIS にすればいいじゃん!と思ったが、さすがにそれはプログラマとしてするわけにはいかない。

なので、そもそもバグなのかはわからないけど、いずれ修正されることを期待しつつ、今回も力業で取り急ぎの対処。以下、ソースコードと手順。

$buf = mb_convert_encoding(file_get_contents(”$CSV FilePath”), “utf-8″, “sjis”);
$fp = tmpfile();
fwrite($fp, $buf);
rewind($fp);

手順としては、

  1. CSV ファイルを一度読み込む
  2. 文字コードをコンバート
  3. テンポラリファイルを作成
  4. コンバートした内容を書き込む
  5. 書き込んだファイルの、ファイルポインタを先頭に戻す
  6. で、fgetcsv で読み込みを行う

これでうまくいった。
コード+4行で動作するのならば、まーいいかな…とは思うけど、相変わらず泥臭い対処方法だと思う。

Jan 19

PHP fgetcsv() 改行コード

1

PHPでファイルを読み込む際、改行コードが、[CR]の場合、どうしてもうまくいかん…前はうまくいっていたのに。と悩むこと少々。

ちょっと検索かけたところ、マニュアルに記述発見。
どうやら、PHP自体の設定で、区分けしているようだ。

PHPマニュアル::ファイルシステム関数

最近(それとも昔から?)は、わざわざ別設定として、読み込む際に、明確に区別していたんですね。

パフォーマンスの問題でしょうか?
ヘンなコード書いちゃう前に設定探せて良かった。

やはり、PHP はマニュアルがいい。

※ ちょっとテストも兼ねて以前別 blog に投稿していたのを再掲。

 Page 2 of 2 « 1  2