4

我正在使用 excel 2010 Professional plus 创建一个 excel 文件。稍后我尝试将其导出为 UTF-8 .csv 文件。我通过将其保存为 CSV 来做到这一点(符号分隔.....对不起,我不知道那里的确切措辞,但我没有英文版,我担心它的翻译方式与 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 文件并将其转换为 .csv 在本地安装了 excel 的测试机器上时偶然发现的问题)。

肿瘤坏死因子

4

5 回答 5

11

来自 PHP 文档

此功能考虑了区域设置。如果 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
)
于 2012-11-10T18:40:32.867 回答
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

于 2012-11-07T10:36:34.527 回答
1

对于捷克共和国的人民:

function convert( $str ) {
    return iconv( "CP1250", "UTF-8", $str );
}
...
while (($data = fgetcsv($this->fhandle, 1000, ";")) !== FALSE) {
$data = array_map( "convert", $data );
...
于 2013-11-28T14:53:22.087 回答
0

根据您的说法,我怀疑 excel 编写了一个没有 BOM的 UTF-8 文件,这使得猜测编码是 utf-8 有点棘手。Format->Encode in UTF-8 (without BOM)如果在按 to (而不是Format->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(...), ...)

于 2012-11-11T11:44:33.543 回答
0

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

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

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

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

于 2012-11-11T12:12:15.030 回答