php fgetcsv-字符集编码问题
使用PHP5.3php 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
fgetcsv
函数,我遇到了一些编码问题。请注意,该文件具有西班牙语“特殊”拉丁字符,如图形重音符号á、é、íï等
我得到了CSV文件,导出了MS2008 for Mac Excel文件中的一些结构化数据
如果我用MacOSXTextEdit
应用程序打开它,一切看起来都很完美
但是当我开始使用我的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()之前设置编码)。所以我不会去投票。