php fgetcsv-字符集编码问题

php fgetcsv-字符集编码问题,php,csv,character-encoding,char,Php,Csv,Character Encoding,Char,使用PHP5.3fgetcsv函数,我遇到了一些编码问题。请注意,该文件具有西班牙语“特殊”拉丁字符,如图形重音符号á、é、íï等 我得到了CSV文件,导出了MS2008 for Mac Excel文件中的一些结构化数据 如果我用MacOSXTextEdit应用程序打开它,一切看起来都很完美 但是当我开始使用我的PHP程序并尝试使用fgetcsv PHP函数读取CSV时,我无法让它正确读取字符集 /** * @Route("/cvsLoad", name="_csv_load") * @Te

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

我得到了CSV文件,导出了MS2008 for Mac Excel文件中的一些结构化数据

如果我用MacOSX
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));
}
如您所见,我还尝试使用
setlocale
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变量中的内容:

那些
字符应该是带有图形重音的元音

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


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

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

尝试将.xls文件上载到google文档并以.csv格式下载。尝试以下操作:

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;
    }
}

我也试过了,但我想情况更糟。不过,我会再试一次。感谢您的快速回复。:)同样的问题。UTF8编码的CSV文件可以在一台服务器上导入,但不能在另一台服务器上导入。最后写了我自己的CSV reader.FWIW,你不可能真正知道一个文件的编码而不被告知。你可以在阅读时猜测,并进行相应的转换,但没有什么比被告知编码更可靠的了。谢谢cbuckley。你说的“相应地转换”是什么意思?试着猜一猜,问用户是否批准导入?如果没有,请继续尝试其他源代码?+1。注意:如果文件是单字节编码的(如CP1252),但区域设置是多字节的,那么fgetcsv将无法按预期工作。这是一个!!:)谢谢。只是一些注释:首先,需要将convert函数声明为静态函数,并将其映射到array_map中为'self:convert';其次,在我的例子中,它是iconv(“macintosh”、“UTF-8”和$str),作为MS Excel for Mac OS使用Mac OS Roman导出到CSV。最后,虽然这是一个很好的答案,并且确实帮助了我,但仍然不能完全解决我的需求,因为我不知道我的用户是否会从Mac或PC或其他任何地方上传文件。。。关于如何检测上传文件的编码是否有其他线索?再次感谢!!你需要使用启发式。。首先查看它是否有效UTF-8或UTF-16,如果无效,请确定PC/MAC(从用户代理标头)并对PC使用Windows-1252,对MAC使用Macintosh。当然,如果用户不使用拉丁语脚本,您可以使用Windows-1251(西里尔文表示Windows)等等。一定有人为此编写了一个库:D@ElPiter如果您希望用户在启用javascript的情况下使用chrome或firefox,那么您可以使用javascript访问文件的内容。然后,您可以用不同的编码表示下拉列表,让用户选择正确显示字符的下拉列表,并在上载时将该信息与文件一起发送。这对我很有用。但是我怀疑有更好的方法(在调用fopen()之前设置编码)。所以我不会去投票。