PHP fgetcsv() 期间未读取 CSV 文件中的某些字符

问题描述 投票:0回答:4

我正在使用 php 读取 CSV 文件。许多行都有一个“复选标记”,它实际上是平方根符号:√,而 php 代码每次遇到这个字符时都会跳过它。

这是我的代码(以“CSV 样式”格式打印到浏览器窗口,以便我可以检查换行是否在正确的位置:

$file = fopen($uploadfile, 'r');
while (($line = fgetcsv($file)) !== FALSE) {
   foreach ($line as $key => $value) {
    if ($value) {
       echo $value.",";
    }
   }
   echo "<br />";
}
fclose($file);

作为临时解决方案,我只是在 Excel 中手动查找复选标记并将其替换为 1。显然我想要一个更有效的解决方案:)感谢您的帮助!

php csv
4个回答
4
投票

fgetcsv() 仅适用于标准 ASCII 字符;所以跳过平方根符号可能是“正确的”。 但是,您可以将文件读入字符串,对这些字符执行 str_replace(),然后使用 fgetcsv() 对其进行解析,而不是手动替换复选标记。 您可以将字符串转换为文件指针(对于 fgetcsv):

$fp = fopen('php://memory', 'rw');
fwrite($fp, (string)$string);
rewind($fp);
while (($line = fgetcsv($fp)) !== FALSE)
...

2
投票

我对字符串的第一个重音字符也有类似的问题。我最终放弃了 fgetscv 并做了以下操作,使用

fgets()
explode()
代替(我猜你的 csv 是逗号分隔的):

$file = fopen($uploadfile, 'r');

while (($the_line = fgets($file)) !== FALSE)  // <-- fgets
{
  $line = explode(',', $the_line);            // <-- explode
  foreach ($line as $key => $value) 
  {
    if ($value) 
    {
      echo $value.",";
    }
  }
  echo "<br />";
}

fclose($file);

0
投票

你应该setlocalear写在文档中

注: 此函数考虑了区域设置。如果 LANG 是例如en_US.UTF-8,该函数读取一字节编码的文件是错误的。

fgetcsv 之前添加 setlocale(LC_ALL, 'en_US.UTF-8')。就我而言,它是“lt_LT.UTF-8”。

此行为被报告为 php bug


0
投票

我正在构建一个发票系统,客户可以上传包含产品名称和价格的 .csv 文件。 一些产品名称包含西班牙字符,例如“Acompañamientos”。

这是我的代码的样子:

if (isset( $_FILES['userfile'])){
    $csv_file = $_FILES['userfile']['tmp_name'];

    if (!is_file( $csv_file )){
        exit('File not found.');
    }
}

if (($handle = fopen($csv_file, "r")) !== FALSE){
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE){
      $sql= "INSERT INTO products SET
        productName ='$data[0]',
        priceBeforeTax = '$data[1]',
        salesTaxTariff = '$data[2]',
        salesTax = '$data[3]',
        priceAfterTax = '$data[4]',
      ";
    }
    
fclose($handle);
}

此西班牙语字符被 � 符号替换,例如 Entra�a 而不是 Entraña。 经过几个小时的研究,一行代码解决了我的问题。 如果您的 PHP 脚本如下,只需在开头添加此内容:

ini_set('default_charset', 'windows-1252');
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.