代码之家  ›  专栏  ›  技术社区  ›  Gazillion

fgetcsv()忽略行首的特殊字符!

  •  11
  • Gazillion  · 技术社区  · 16 年前

    我有一个简单的脚本,它接受一个CSV文件并将每一行读入一个数组。然后,我循环浏览第一行的每一列(在我的例子中,它包含调查的问题),然后打印出来。调查是用法语进行的,只要问题的第一个字符是特殊字符(,,§,等等),fgetcsv就会省略它。

    只有当它们是第一个字符时,才不会影响值中间的特殊字符。

    我试图调试这个,但我感到困惑。我用文件的内容做了一个var\u转储,字符肯定在那里:

    var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));
    

    这是我的密码:

    if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
        {
            $csv_arr = array();
    
            //Populate an array with all the cells of the CSV file
            while(!feof($csv))
            {
                $csv_arr[] = fgetcsv($csv);
            }
    
            //Close the file, no longer needed
            fclose($csv);
    
            // This should cycle through the cells of the first row (questions)
            foreach($csv_arr[0] as $question)
            {
                echo utf8_encode($question) . "<br />";
            }
    
        }
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   Pekka    16 年前

    manual page on fgetcsv ? 没有什么可以马上讨论这个特定的问题,但是如果这里什么都没有出现的话,一些贡献也许值得一看。

    比如说:

    注意:此函数将考虑区域设置。如果LANG是例如en\u US.UTF-8,则此函数将读取错误的单字节编码文件。

    而且,由于总是在行首,这真的是一个隐藏的断线问题吗?这是:

    您还可以尝试用不同的行尾保存文件。

        2
  •  8
  •   t0mm13b    13 年前

    fgetcsv() ?

    setlocale(LC_ALL, 'fr_FR.UTF-8');
    

    否则, fgetcsv() 不是多字节安全的。

    locale -a
    

    C
    en_US.utf8
    POSIX
    

    对于UTF8支持,选择一个末尾带有UTF8的编码。如果您的输入是用其他语言编码的,您需要使用适当的语言环境,但是首先要确保您的操作系统支持它。

    如果您将区域设置为系统上不可用的区域设置,它将不会对您有所帮助。

        3
  •  2
  •   David Johnstone    15 年前

    bug report 申请了,但很明显 isn't a bug .

        4
  •  1
  •   eswald    14 年前

    LANG C ,并通过确保这些值用引号括起来来解决它。例如

    a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"
    

    通过时生成以下数组 fgetcsv()

    array (
      0 => 'a',
      1 => 'a',
      2 => '',
      3 => 'é',
      4 => '',
      5 => 'óú',
      6 => '&ú',
      7 => 'ó&ú',
    )
    

    当然,您必须通过将值中的引号加倍来避开引号,但这比修复丢失的字符要简单得多。

    推荐文章