【问题标题】:Excel-generated CSV, special characters disappear (ÆØÅ) - PHPExcel 生成的 CSV,特殊字符消失 (ÆØÅ) - PHP
【发布时间】:2012-01-02 20:18:04
【问题描述】:

我有一些 csv 文件需要使用 php 导入到我们的系统中。我住在挪威,我们有 3 个特殊字符(æøå 和大写 ÆØÅ)。问题是大写版本只是从我的字符串中消失了。小写字母用 ? 显示,但使用 utf8_encode 时,我得到了正确的字母。

我正在使用以下函数来导入和读取 csv 文件。倾倒$arr时,ÆØÅ字母已经消失了

$row = 1;
$arr = array();
if (($handle = fopen($imp['importBreddegave'], "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $num = count($data);
        $row++;

        for ($c=0; $c < $num; $c++) {
            $arr[$row][$c] = $data[$c];
        }
    }

    fclose($handle);
}

我想我需要以某种方式指定字符编码,但我不知道如何。据我所知,按照标准,cvs 文件是由WINDOWS-1257 编码的。我页面的其余部分用UTF-8编码

有人有什么巧妙的技巧吗?

【问题讨论】:

    标签: php encoding csv utf-8


    【解决方案1】:

    如果您的页面输出 UTF-8 数据(或更好:声明它通过 HTTP 标头/元字符集输出 UTF-8),您应该确保输出的数据也是 UTF-8。 您在 Windows-1257 中输出数据,尽管您的页面声明它是 UTF-8,导致字符无法正确呈现。

    使用 utf8_encode 将它们转换为 utf8(更好,因为 utf8_encode 假定您的源字符集是 ISO-8859-1,但它不是)iconv (http://php.net/iconv)

    【讨论】:

    • 使用echo $fc = iconv('windows-1255', 'utf-8', file_get_contents($imp['importBreddegave']));可以正确显示内容,但是如何在fopen中使用iconv呢?
    • $arr[$row][$c] = $iconv('windows-1251', 'utf-8', data[$c]);
    • 不起作用,此时大写字母已经消失。我想我需要在 fopen 指定这个,但我不知道怎么做。
    • 看看“笔记”下的be.php.net/fgetcsv——这可能是罪魁祸首。在执行当前代码之前试试这个: setlocale(LC_CTYPE, 'en_US.UTF-8');
    • 没有用,但我设法自己修复了它。似乎fgetcsvfopen 不适用于这些字符。将我的脚本写入使用file_get_contents 并分解字符串。不那么整洁,但它有效。
    【解决方案2】:

    这个丑陋的 hack 奏效了。我不得不避免使用fgetcsvfopen

    $arr = array();
    $content = iconv('windows-1252', 'utf-8', file_get_contents($imp['importBreddegave']));
    $contentArr = explode("\n",$content);
    foreach ($contentArr as $kr) {
        $tempArr = explode(";",$kr);
        $arr[] = $tempArr;
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      首先,要查看 UTF-8 编码,请在页面开头添加以下内容:

      &lt;?php header('Content-Type: text/html; charset=UTF-8'); ?&gt;

      fopenfgetcsv 使用编码:

      $data = array_map("utf8_encode", $data);

      最重要的是:用记事本打开 CSV 并以 UTF-8 格式保存:

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 2017-05-16
        • 1970-01-01
        • 2012-08-19
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多