2

私はコードをもっている。ローカルホストでは、csvファイル(Unicode文字を使用)の読み取りに問題はありません。しかし、ホスト出力にコードをアップロードするときは何もありません。なぜ?解決策は何ですか?

while (($data=fgetcsv($fin,5000,","))!==FALSE) 
{
 var_dump($data[0]);  //on host output is `string(0) ""` but on local i can see output
 var_dump($data[1]);  //$data[1] is integer and  i can see output
}
4

3 に答える 3

7

ノート:

この関数では、ロケール設定が考慮されます。LANGがen_US.UTF-8などの場合、1バイトエンコーディングのファイルはこの関数によって誤って読み取られます。

http://php.net/fgetcsv

考えられる解決策の1つは、を使用することsetlocale()です。

于 2011-05-28T10:00:21.417 に答える
2

そのようなものの1つは、UTFバイトオーダーマーク(BOM)の出現です。バイト順マークのUTF-8文字はU+FEFFであり、テキストファイルの先頭にある3バイト(0xef、0xbb、および0xbf)です。UTF-16の場合、バイト順序を示すために使用されます。UTF-8の場合、これは実際には必要ありません。

したがって、3バイトを検出し、BOMを削除する必要があります。以下は、3バイトを検出して削除する方法の簡単な例です。

$str = file_get_contents('file.utf8.csv');
$bom = pack("CCC", 0xef, 0xbb, 0xbf);
if (0 == strncmp($str, $bom, 3)) {
    echo "BOM detected - file is UTF-8\n";
    $str = substr($str, 3);
}

それで全部です

于 2012-09-28T15:42:05.310 に答える
1

Unicodeエンコーディングにiconvを使用しましたが、私の状況ではほぼ完璧に機能します。それが他の誰かにも役立つことを願っています。

$csvFile = fopen('file/path', "r");
fgetcsv($csvFile);
while(($row = fgetcsv($csvFile, 1000, ";")) !== FALSE){        
  for ($c=0; $c < count($row); $c++) {
    echo iconv( "Windows-1252", "UTF-8", $row[$c]);
  }
}
fclose($csvFile);
于 2017-12-22T02:39:51.657 に答える