14

使用 PHP 5.3fgetcsv函数,由于编码问题,我遇到了一些问题。请注意,该文件具有西班牙语“特殊”拉丁字符,如图形重音 á、é、í ï 等...

我得到了 CSV 文件,它导出了我在 MS 2008 for Mac Excel 文件中拥有的一些结构化数据。

如果我用 Mac OS XTextEdit应用程序打开它,一切似乎都很完美。

但是当我开始使用我的 PHP 程序并尝试使用该 fgetcsv PHP 函数读取 CSV 时,我并没有让它正确读取字符集。

/**
 * @Route("/cvsLoad", name="_csv_load")
 * @Template()
 */
public function cvsLoadAction(){
    //setlocale(LC_ALL, 'es_ES.UTF-8');
    $reader = new Reader($this->get('kernel')->getRootDir().'/../web/uploads/documents/question_images/2/41/masiva.csv');

    $i = 1;
    $r = array("hhh" => $reader -> getAll());

    return new Response(json_encode($r, 200));
}

如您所见,我也尝试过使用setlocaleto es_ES.UTF-8。但是没有任何东西让它工作。

阅读部分在这里:

public function getRow()
{
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) {
        $this->_line++;
        return $this->_headers ? array_combine($this->_headers, $row) : $row;
    } else {
        return false;
    }
}

查看每行读取后我在 $row 变量中得到的内容:

在此处输入图像描述

这些?字符应该是带有图形重音的元音。

那边有什么线索吗?如果我在 Windows 上使用 MS Excel,它会起作用吗?我如何在运行时知道文件的确切编码并在读取之前设置它?

(对于那些讲西班牙语的人,不要对那些文本中如此糟糕的医学内容感到害怕;))。

4

2 回答 2

38

尝试这个:

function convert( $str ) {
    return iconv( "Windows-1252", "UTF-8", $str );
}

public function getRow()
{
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) {
        $row = array_map( "convert", $row );
        $this->_line++;
        return $this->_headers ? array_combine($this->_headers, $row) : $row;
    } else {
        return false;
    }
}
于 2012-11-08T21:53:18.223 回答
0

这可能与 excel 在保存时对文件进行编码的方式有关。

尝试将 .xls 文件上传到谷歌文档并下载为 .csv

于 2012-11-08T21:46:32.563 回答