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,则此函数会错误地读取单字节编码的文件。

http://php.net/fgetcsv

一种可能的解决方案是使用setlocale().

于 2011-05-28T10:00:21.417 回答
2

其中之一是 UTF 字节顺序标记或 BOM 的出现。字节顺序标记的 UTF-8 字符是 U+FEFF,或者更确切地说是三个字节——0xef、0xbb 和 0xbf——位于文本文件的开头。对于 UTF-16,它用于指示字节顺序。对于 UTF-8 来说,这并不是必需的。

所以你需要检测这三个字节并移除BOM。下面是一个关于如何检测和删除三个字节的简化示例。

$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

我使用 iconv 进行 unicode 编码,它在我的情况下几乎完美。我希望它也会对其他人有所帮助。

$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 回答