【问题标题】:Excel csv export into a php file with fgetcsv使用 fgetcsv 将 Excel csv 导出为 php 文件
【发布时间】:2012-10-27 07:09:12
【问题描述】:

我正在使用 excel 2010 Professional plus 创建一个 excel 文件。 稍后我尝试将其导出为 UTF-8 .csv 文件。 我通过将其保存为 CSV 来做到这一点(符号分隔.....sry 我不知道那里的确切措辞 但我没有英文版,我担心它的翻译与 1:1 不同)。 在那里我单击工具-> weboptions 并选择 unicode (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 作为屏幕上的结果(因为那是“错误”,我剪切了结果的所有其他部分)。
  • 如果我使用 notepad++ 打开文件并查看编码,我会看到“ANSI”而不是 UTF-8。
  • 如果我将 notepad++ 中的编码更改为 UTF8.... ö,ä,... 将被特殊字符替换,我必须手动更正。

如果我走另一条路,用notepad++创建一个新的UTF-8文件,并输入与excel文件相同的数据,当我用php文件打开它时,屏幕上会显示“Österreich”。

现在我的问题是,为什么它不能与 excel 一起使用,所以我在这里做错了什么?还是我忽略了什么?

编辑: 由于程序最终会安装在客户提供的 windows 服务器上, 在不需要安装其他工具的情况下需要一个解决方案(php 库,... 可以,但必须安装 vm-ware 或 cygwin,... 不是)。 此外,服务器上不会本地安装 excel(或 office)作为 客户将能够通过文件上传对话框上传 .csv 文件(对话框本身 不是问题的一部分,因为我知道如何处理这些问题,此外,当我在本地安装了 excel 的测试机器上创建一个 excel 文件并将其转换为 .csv 时,我偶然发现了问题本身。 p>

Tnx

【问题讨论】:

    标签: php excel csv


    【解决方案1】:

    我不知道为什么 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

    【讨论】:

    • 是否有另一种方法可以在不依赖 unix 命令的情况下做到这一点? (该应用程序应该能够在相当多的不同 Windows 机器上运行,而无需安装额外的工具,因此必须在那些允许我使用 unix 命令的服务器上安装工具并不是什么好事)。跨度>
    【解决方案2】:

    From PHP DOC

    此功能会考虑区域设置。如果 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
    )
    

    【讨论】:

    • array_map 是解决方案 tnx。没想到如果我已经告诉程序我正在阅读的是 UTF-8,我将不得不再次将它明确地映射为 UTF-8。 (有趣的现象......除了excel导出它仍然为ANSI)再次Tnx。
    【解决方案3】:

    根据您的说法,我怀疑 excel 写入了一个 UTF-8 文件without BOM,这使得猜测编码是 utf-8 有点棘手。如果按下 Format-&gt;Encode in UTF-8 (without BOM)(而不是 Format-&gt;Convert to UTF-8 (without BOM))时字符在 Notepad++ 中正确显示,您可以确认此诊断。

    您确定每个用户都会使用 UTF-8 吗?在我看来,您需要一些能够巧妙地猜测您的真实输入编码是什么的东西。我所说的“智能”是指这种猜测可以识别无 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(...), ...)

    【讨论】:

    • 对于excel。我用记事本++检查了文件。 Notepad++ 告诉我它们仍然是 ANSI(即使导出为 UTF8)。当我将 UTF8 编码文件(使用 notepad++ 创建)导入 excel 时,就好像存在错误的编码(我得到特殊字符而不是 ö、ü、....)。
    • @ThomasE。无论如何,这个解决方案应该有效。此外,它应该能够处理非 UTF8 输入。它与 Baba 没有什么不同,因为它将 utf8_encode 应用于从有问题的 csv 文件中导入的字符串。
    【解决方案4】:

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

    当我尝试您的示例并仔细检查确实是 utf-8 的文件时,它对我有用,我得到:

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

    使用 LibreOffice (OpenOffice),这类事情更可靠。

    【讨论】:

      【解决方案5】:

      对于捷克共和国的人民来说:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多