php fgetcsv - charset编码问题

ElP*_*ter 11 php csv char character-encoding

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

我得到CSV文件导出我在MS 2008 for Mac Excel文件中的一些结构化数据.

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

但是当我开始使用我的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));
}
Run Code Online (Sandbox Code Playgroud)

如你所见,我也试过用a setlocalees_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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

这些?角色应该是带有图形重音的元音.

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

(对于那些西班牙语的人来说,不要在这些文本中对这些可怕的医学内容感到恐惧;)).

Esa*_*ija 32

试试这个:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1.关于[docs](http://php.net/manual/en/function.fgetcsv.php)的注意事项:如果文件是单字节编码的(例如CP1252),但是语言环境是多字节的,那么fgetcsv不会按预期工作. (2认同)