[PHP-dev 88] Re: ようこそ "PHP-dev" メーリングリストへ (Digest mode)

saito php-dev@php.gr.jp
Fri, 02 Nov 2001 18:05:49 +0900


はじめまして。

PHP Version 4.0.2のコマンドライン版で、fgetcsvで、日本語コードの文字が欠ける 
といった現象が発生しています。


PHPは、以下のconfigureオプションで生成しています。
./configure --with-oci8 --enable-sigchild --with-zlib --with-png 
--enable-track-vars --enable-force-cgi-redirect --enable-jstring=shared 
--enable-mbregex=shared

ShiftJIS設定にしています。

プログラムリストは次の通りです

<?php
	$b = array();
	$b[0] = "./20011113_0001.csv";
	$b[1] = "./20011113_0002.csv";
	$b[2] = "./20011113_0003.csv";
	//ファイル検索
	for( $j = 0; $j < count($b) ; $j ++ ){
		$fp = fopen($b[$j],"r") or die("ファイル読込みでエラーが発生しました。");
		$a = array();
		while($a = fgetcsv( $fp , 2000 )){
			for( $i = 0 ; $i < count($a) ; $i ++ )
				echo $a[$i]." ";
			echo "<BR>\n";
			if( (count($a) == 13)&&(ereg("^[0-9]{14}$",$a[1]))&&
				(ereg("^[0-9]*$",$a[10]))&&(ereg("^[0-9]*$",$a[11]))&&(ereg("^[0-9]*$",$a[12]))&&
				(ereg("^[0-9]*$",$a[8])) ){

				$arraydate = getdate();
				$datetime =
						$arraydate["year"].sprintf("%02d",$arraydate["mon"]).
						sprintf("%02d",$arraydate["mday"]).sprintf("%02d",$arraydate["hours"]).
						sprintf("%02d",$arraydate["minutes"]).sprintf("%02d",$arraydate["seconds"]);
			}
		}
		fclose( $fp );
	}
?>

データファイル次の内容で 20011113_0001.csv 〜 20011113_0003.csvを作成

002,20011000000000,●●●●●●●●●●●●●●●●●●●●●●●●●●●●● 
●●●●●●●●●,1,白水 りえ,●●●●●●● 
●,xxxxxxxxxxx@xxx.xxx.xx.xx,000-0000,00,●●●●●●●,000,000,0000


以上のファイルを実行すると

002 〜中略〜 1 白水 りえ 〜中略〜
002 〜中略〜 1 白水 り 〜中略〜
002 〜中略〜 1 白水 り 〜中略〜

という出力になります。
2件目以降のカンマの直前の「え」という文字で、かなりの確立で文字欠けが生じます。
if文の中の処理を省くと文字化けは発生しなくなります。

また、fgetとsplitでcsvを分離した場合は正常に動作します。
fgetcsvとgetdateの相性が悪かったりするのでしょうか?それともfgetcsvにバグがあ 
るのでしょうか?
今後fgetcsvを使用していいものかどうか悩んでいます。

古いバージョンの話で申し訳ありませんが、何か知っている方がおられたら御回答お 
願いします。


斉藤 彰良