[PHP-dev 1205] PHP5のfgetcsv()関数について

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

[PHP-dev 1205] PHP5のfgetcsv()関数について

Masanori Kobayashi
小林といいます。

PHP4の環境からPHP5への移行作業をしています。
CSVファイルを取り込んで表示するプログラムを移行したのですが、このとき、
PHP5のfgetcsv()関数は、""で括られている項目内に改行コードが含まれている
CSVファイルを正しく読み込めません。改行コード単位でしかレコードのハンド
リングが出来ていないようです。同じファイルをPHP4のfgetcsv()関数は正しく
読み込むことが出来ます。

ざっと、bugs.php.netを見たのですが、当てはまるものが無いようでしたが、既
に登録されているバグであったらすいません。

-------------------
csvファイルの例
test.csv
-------------------
1,2,20051101,"あいうえおかきくけこ

さしすせそ
たちつてとなにぬねの",200,2005-11-01
-------------------

$a = fgetcsv("test.csv");
これをPHP5.0.5で実行すると・・・
$a[0] : 1
$a[1] : 2
$a[2] : あいうえおかきくけこ

となり、PHP4.3.11で実行すると、
$a[0] : 1
$a[1] : 2
$a[2] : あいうえおかきくけこ\n\nさしすせそ\nたちつてとなにぬねの
$a[3] : 200
$a[4] : 2005-11-01
(便宜的に改行は\nで表示)

--
_/_/ Masanori Kobayashi

_______________________________________________
PHP-dev mailing list
[hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|

[PHP-dev 1206] Re: PHP5のfgetcsv()関数について

Moriyoshi Koizumi
小泉です。

# すみませんが、PR 番号は何番になりますか?
# ざっと見た限り見つからなかったので。

CSVの文字エンコーディング、それからロカールの設定は
どうなっているでしょう。

PHP 5.0 の fgetcsv() はロケールの設定に依存します。

Masanori Kobayashi wrote:

>小林といいます。
>
>PHP4の環境からPHP5への移行作業をしています。
>CSVファイルを取り込んで表示するプログラムを移行したのですが、このとき、
>PHP5のfgetcsv()関数は、""で括られている項目内に改行コードが含まれている
>CSVファイルを正しく読み込めません。改行コード単位でしかレコードのハンド
>リングが出来ていないようです。同じファイルをPHP4のfgetcsv()関数は正しく
>読み込むことが出来ます。
>  
>

_______________________________________________
PHP-dev mailing list
[hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|

[PHP-dev 1207] Re: PHP5のfgetcsv()関数について

Masanori Kobayashi
小林です。

> # すみませんが、PR 番号は何番になりますか?
PR番号とは・・・・
すみません、ちょっと認識不足でPHP5.0.5とまでしかわかりません。現在公開さ
れているものをインストールしました。

> CSVの文字エンコーディング、それからロカールの設定は
CSVのエンコーディングはSJISのファイルです。
サーバ自体はEUC-JPで、PHPの文字エンコードセッティングはUTF-8にしています。
現在同じサーバ上で運用しているPHP4は、PHPの文字エンコーディングセッティ
ングはEUC-JPで、SJISのCSVファイルを読み込んでいます。

> PHP 5.0 の fgetcsv() はロケールの設定に依存します。
サーバのローケルがEUC-JPの場合は、CSVファイルもEUC-JPでないと正しく動作
しないということでしょうか。素人のような質問で申し訳ありません。
とりあえず、CSVファイルをEUC=JPにして試してみます。
改めて結果報告します。

--
_/_/ Masanori Kobayashi
_/_/ mailto:[hidden email]
_/_/ mailto:[hidden email]

_______________________________________________
PHP-dev mailing list
[hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|

[PHP-dev 1208] Re: PHP5のfgetcsv()関数について

Masanori Kobayashi
In reply to this post by Moriyoshi Koizumi
小林です。

CSVファイルをEUC-JPにコード変換したら正しく動作しました。
PHP4はローケルの設定とファイルのエンコードが違っていてもCSVファイルを読
み込めていたので、同じように使えると思い込んでいました。
PHP5への移行作業には思いもよらぬ仕様変更が隠れているのですね。
PHP5を開発された方々が熟慮した結果の仕様変更だとは思いますが、ローケルと
違うエンコードのファイルを読み込んで、自分の環境に合わせてコード変換して
使用することは多々あることだと思います。CSVファイルを扱う上では便利な関
数であっただけに、少々残念な仕様変更です。

ありがとうございました。
--
_/_/ Masanori Kobayashi
_/_/ mailto:[hidden email]
_/_/ mailto:[hidden email]

_______________________________________________
PHP-dev mailing list
[hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|

[PHP-dev 1209] Re: PHP5のfgetcsv()関数について

Moriyoshi Koizumi
小泉です。

失礼しました。すでに bugs.php.net にレポートを投稿されたのかと
勘違いしていました。PR番号とはレポートの番号のことです。

Masanori Kobayashi wrote:

>小林です。
>
>CSVファイルをEUC-JPにコード変換したら正しく動作しました。
>PHP4はローケルの設定とファイルのエンコードが違っていてもCSVファイルを読
>み込めていたので、同じように使えると思い込んでいました。
>PHP5への移行作業には思いもよらぬ仕様変更が隠れているのですね。
>PHP5を開発された方々が熟慮した結果の仕様変更だとは思いますが、ローケルと
>違うエンコードのファイルを読み込んで、自分の環境に合わせてコード変換して
>使用することは多々あることだと思います。CSVファイルを扱う上では便利な関
>数であっただけに、少々残念な仕様変更です。
>  
>
locale の設定はsetlocale() 関数によってスクリプト中で動的に変更可能です。


_______________________________________________
PHP-dev mailing list
[hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|

[PHP-dev 1210] Re: PHP5のfgetcsv()関数について

Masanori Kobayashi
小泉様

いろいろ、ありがとうございます。
> locale の設定はsetlocale() 関数によってスクリプト中で動的に変更可能です。

この関数を使用することで、ローケルを明示的に正しく認識してプログラミング
できるようになっていたのですね。まだまだ、PHPについて学ばなければならな
いことが多いと感じます。

少々乱暴ですが、
setlocale(LC_ALL, 'ja_JP.UTF-8');
で、UTF-8のCSVファイルについてはfgetcsv()は希望通りに動作しました。
ためしにsetlocale()をコメントアウトしても希望通りに動作しました。

しかし、
setlocale(LC_ALL, 'ja_JP.SJIS');
で、SJISのCSVファイルについてはfgetcsv()はうまく動作しませんでした。
SJISのCSVファイルの読み込みは鬼門のようです。

--
_/_/ Masanori Kobayashi

_______________________________________________
PHP-dev mailing list
[hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-dev