类似问题:
Some characters in CSV file are not read during PHP fgetcsv()
fgetcsv() ignores special characters when they are at the beginning of line
我的应用程序有一个表单,用户可以上传一个csv文件(其5个内部用户总是上传一个有效的文件-逗号分隔、引号、以lf结尾的记录),然后使用php将该文件导入数据库:

$fhandle = fopen($uploaded_file,'r');
while($row = fgetcsv($fhandle, 0, ',', '"', '\\')) {
    print_r($row);
    // further code not relevant as the data is already corrupt at this point
}

由于我无法更改的原因,用户正在上载用Windows-1250字符集编码的文件-单字节8位字符编码。
问题是:还有一些(不是全部!)超过127的字符(“扩展ascii”)将被放入fgetcsv()。示例数据:
"15","Ústav"
"420","Špičák"
"7","Tmaň"

变成
Array (
  0 => 15
  1 => "stav"
)
Array (
  0 => 420
  1 => "pičák"
)
Array (
  0 => 7
  1 => "Tma"
)

(注意č被保留,但Ú被删除)
fgetcsv的文档说“既然4.3.5 fgetcsv()现在是二进制安全的”,但看起来不是。我做错了什么,还是这个函数坏了,我应该寻找一种不同的方法来解析csv?

最佳答案

结果发现,我没有很好地阅读文档-fgetcsv()只是有点二进制安全。对于纯asciithe documentation also says:
音符:
已考虑区域设置
通过这个功能。如果郎是。
en_us.utf-8,一个字节的文件
编码被读取错误
功能
换言之,fgetcsv()试图实现二进制安全,但实际上不是这样(因为它同时也在处理字符集),而且它可能会损坏读取的数据(因为此设置不是在php.ini中配置的,而是从$LANG读取的)。
我回避了这个问题,用fgets读取了行(它处理字节,而不是字符),并使用a CSV function from the comment in the docs将它们解析为一个数组:

$fhandle = fopen($uploaded_file,'r');
while($raw_row = fgets($fhandle)) { // fgets is actually binary safe
    $row = csvstring_to_array($raw_row, ',', '"', "\n");
    // $row is now read correctly
}

10-02 05:31