PHPコーディング
fgetcsv関数の不思議
2010年06月03日
作成したツールで文字化けが起こっているとの連絡を受けました。
私が契約しているサーバーでは、全く問題なく動作しています。
色々調べると、あるサーバーでその現象が起こっていることがわかりました。
さらに詳しく調べると、【fgetcsv】関数がファイルから文字を読み込む際、文字化けを起こしていることがわかりました。
ネットで調べると、この問題に引っかかっている方もたくさんいらっしゃるようです。
あちこちに書き込みがあります。
そうやら、PHPのバージョンアップの際、関数の仕様が変更になったようです。
こういう基本的な関数の仕様を変更されると、痛いです。
しかし、更に調べると、更にバージョンの高いPHPではこの現象は起こっていません。
ということは、仕様がまた変更になったということのようです。
要は特定のバージョンのPHPでのみ起こる現象、ということです。
csvで囲み文字を使っている場合、問題なく動作するようです。
でも、csvの本来の形式って確か、項目の値を囲まないはずでは???
回避方法としては、ファイルからはシンプルに文字列を読み込んで、あとは自分で処理すればいいようです。
前からいつか書き直そうと思っていた部分なので、ついでに書き直します。
正規表現を使う方法や、ファイル全体をそのまま読み込む方法もありますが、私が取った方法です。
【fgets】関数で、ファイルを1行ずつ読み込み。
改行文字列を削除。
区切り文字列で分割。
です。
今回は囲み文字列はないので、飛ばします。区切り文字列がタブの場合です。
while (($line = fgets($handle)) !== false) {
$line = str_replace("\n", "", $line);
$line = str_replace("\r", "", $line);
$csv_data = explode("\t", $line);
}
これで問題なく動き始めました。
私が契約しているサーバーでは、全く問題なく動作しています。
色々調べると、あるサーバーでその現象が起こっていることがわかりました。
さらに詳しく調べると、【fgetcsv】関数がファイルから文字を読み込む際、文字化けを起こしていることがわかりました。
ネットで調べると、この問題に引っかかっている方もたくさんいらっしゃるようです。
あちこちに書き込みがあります。
そうやら、PHPのバージョンアップの際、関数の仕様が変更になったようです。
こういう基本的な関数の仕様を変更されると、痛いです。
しかし、更に調べると、更にバージョンの高いPHPではこの現象は起こっていません。
ということは、仕様がまた変更になったということのようです。
要は特定のバージョンのPHPでのみ起こる現象、ということです。
csvで囲み文字を使っている場合、問題なく動作するようです。
でも、csvの本来の形式って確か、項目の値を囲まないはずでは???
回避方法としては、ファイルからはシンプルに文字列を読み込んで、あとは自分で処理すればいいようです。
前からいつか書き直そうと思っていた部分なので、ついでに書き直します。
正規表現を使う方法や、ファイル全体をそのまま読み込む方法もありますが、私が取った方法です。
【fgets】関数で、ファイルを1行ずつ読み込み。
改行文字列を削除。
区切り文字列で分割。
です。
今回は囲み文字列はないので、飛ばします。区切り文字列がタブの場合です。
while (($line = fgets($handle)) !== false) {
$line = str_replace("\n", "", $line);
$line = str_replace("\r", "", $line);
$csv_data = explode("\t", $line);
}
これで問題なく動き始めました。
コメント