2012-11-08 58 views
9

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

我得到的CSV文件导出一些结构化数据我有一个MS 2008的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)); 
} 

正如你所看到的,我曾尝试也使用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; 
    } 
} 

看看我得到的$ row变量每行读数后:

enter image description here

那些?字符被认为是与图形元音他们的口音。

那里的任何线索?如果我使用MS Excel for Windows,它会工作吗?如何在运行时知道文件的确切编码并在读取之前进行设置? (对那些西班牙语的人来说,不要因为这些文本中的这种可怕的医疗材料而受到惊吓;))。

+1

同样的问题。 UTF8编码的CSV文件可以在一台服务器上正常导入,但不会导入其他服务器。结束写我自己的CSV阅读器。 –

+0

FWIW,你不能不知道*文件的编码而不被告知。你可以猜出你什么时候阅读它,然后进行相应的转换,但是没有什么东西比被告知编码更可靠。 – cmbuckley

+0

谢谢cbuckley。 “相应地转换”是什么意思,尝试猜测并询问用户是否批准导入?如果不是,继续尝试其他编码的原点? – ElPiter

回答

28

试试这个:

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

+1。请注意[docs](http://php.net/manual/en/function.fgetcsv.php):如果文件是单字节编码的(例如CP1252),但区域设置为多字节,则fgetcsv不会按预期工作。 – cmbuckley

+0

这是一个! :) 非常感谢。只是一些评论:首先,需要声明为静态函数convert并将其映射到array_map中作为'self:convert';第二,在我的情况下,它是iconv(“macintosh”,“UTF-8”,$ str),因为用于Mac OS的MS Excel使用Mac OS Roman导出为CSV。最后,尽管这是一个很好的答案,对我的帮助确实很大,但仍然不能解决我的需求,因为我不知道我的用户是否会从Mac或PC上传文件或任何其他任何线索如何检测哪个是上传文件的编码?再次感谢!! – ElPiter

+0

你需要使用启发法。首先看看它是否是有效的UTF-8或UTF-16,如果不是,则确定PC/MAC(来自用户代理标题)并使用Windows-1252用于PC和Macintosh用于mac。当然,如果用户不使用拉丁脚本,则可以使用Windows-1251(西里尔语的Windows)等。有人必须为此编写一个库:D – Esailija

0

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

尝试上传.xls文件到Google Docs和下载为.csv

+0

我也试过了,但我觉得它变得更糟。不过,我会再试一次。感谢您的快速响应。 :) – ElPiter