我有一个代码。在localhost上我没有读取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
}
注意:
此功能考虑了区域设置。如果LANG是例如en_US.UTF-8,此函数读取单字节编码的文件错误。
一种可能的解决方案是使用setlocale()
。
其中一个问题是出现了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);
}
就这样
我使用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);