Excel CSV导出到一个PHP文件与Fgetcsv

我正在使用Excel 2010专业版加上创build一个Excel文件。 后来我试图将其导出为UTF-8 .csv文件。 我通过将其保存为CSV(符号分隔…… sry)我做到这一点,我不知道在那里确切的措辞,但我没有英文版本,我担心它翻译不同于1:1 。 在那里我点击tools-> weboptions并selectunicode(UTF-8)作为编码。 示例.csv如下所示:

ID;englishName;germanName 1;Austria;Österreich 

到目前为止这么好,但如果我现在用我的PHP代码打开文件:

  header('Content-Type: text/html; charset=UTF-8'); iconv_set_encoding("internal_encoding", "UTF-8"); iconv_set_encoding("output_encoding", "UTF-8"); setlocale(LC_ALL, 'de_DE.utf8'); $fp=fopen($filePathName,'r'); while (($dataRow= fgetcsv($fp,0,";",'"') )!==FALSE) { print_r($dataRow); } 
  • 我得到: sterreich作为结果在屏幕上(因为这是“错误”我削减了结果的所有其他部分)。
  • 如果我用记事本++打开文件,并看看编码,我看到“ANSI”,而不是UTF-8。
  • 如果我将记事本++中的编码更改为UTF8 ….ö,ä,…被特殊字符replace,我必须手动进行更正。

如果我走另一条路线,用记事本++创build一个新的UTF-8文件,并放入与Excel文件相同的数据,我会在屏幕上显示“Österreich”,当我打开它的PHP文件。

现在我的问题是,为什么它不能与excelfunction,所以我在这里做错了什么? 还是我忽略了一些东西?

编辑: 由于该程序将最终安装在客户提供的Windows服务器上,需要一个解决scheme,在没有必要安装额外的工具(PHP库,…是好的,但必须安装一个虚拟软件或cygwin,…不是)。 此外,服务器上不会有本地安装的excel(或办公室),因为客户可以通过文件上载对话框上传.csv文件(对话本身不是问题的一部分,因为我知道如何处理这些问题本身,我偶然发现,当我创build了一个Excel文件,并将其转换为excel本地安装的testing机器上的.csv)。

TNX

从PHP DOC

语言环境设置由此function考虑。 如果LANG是例如en_US.UTF-8, 则使用该函数读取单字节编码的文件。

你可以试试

 header('Content-Type: text/html; charset=UTF-8'); $fp = fopen("log.txt", "r"); echo "<pre>"; while ( ($dataRow = fgetcsv($fp, 1000, ";")) !== FALSE ) { $dataRow = array_map("utf8_encode", $dataRow); print_r($dataRow); } 

产量

 Array ( [0] => ID [1] => englishName [2] => germanName ) Array ( [0] => 1 [1] => Austria [2] => Österreich ) 

我不知道为什么Excel会生成ANSI文件而不是UTF-8(如您在Notepad ++中看到的),但是如果是这种情况,则可以使用iconv转换文件:

iconv –from-code = ISO-8859-1 –to-code = UTF-8 my_csv_file.csv> my_csv_file_utf8.csv

对捷克共和国人民来说:

 function convert( $str ) { return iconv( "CP1250", "UTF-8", $str ); } ... while (($data = fgetcsv($this->fhandle, 1000, ";")) !== FALSE) { $data = array_map( "convert", $data ); ... 

问题一定是你的文件编码,它看起来不是utf-8。

当我尝试你的例子,并检查确实是UTF-8的文件,它适用于我,我得到:

数组([0] => 1 [1] =>奥地利[2] =>Österreich)

使用LibreOffice(OpenOffice),对于这些事情更可靠。

从你说的话,我怀疑excel写没有BOM的UTF-8文件,这使得猜测编码是UTF-8稍微棘手。 如果按下Format->Encode in UTF-8 (without BOM) (而不是Format->Convert to UTF-8 (without BOM) ),则可以在Notepad ++中正确显示字符时确认此诊断。

你确定每个用户都会使用UTF-8吗? 听起来,你需要一些能够对你的真实input编码做些什么的聪明的猜测。 通过“智能”,我的意思是这个猜测可以识别无BOM的UTF-8。

为了削减,我会做这样的事情:

 $f = fopen('file.csv', 'r'); while( ($row = fgets($f)) != null ) if( mb_detect_encoding($row, 'UTF-8', true) !== false ) var_dump(str_getcsv( $row, ';' )); else var_dump(str_getcsv( utf8_encode($row), ';' )); fclose($f); 

这是因为你阅读字符来猜测编码,而不是懒惰地相信前3个字符:所以没有BOM的UTF-8仍然会被识别为UTF-8。 当然,如果你的csv文件不是太大,你可以对整个文件内容进行编码检测:像mb_detect_encoding(file_get_contents(...), ...)