【问题标题】:UTF-8 htmlentities and fgetcsvUTF-8 htmlentities 和 fgetcsv
【发布时间】:2013-07-26 14:52:08
【问题描述】:

导入 csv 文件后,我在将特殊字符转换为 htmlentities 时遇到问题。

下面是相关代码:

setlocale(LC_ALL, 'fr_FR.utf8');

if (empty($errors) && ($handle = fopen($_FILES["file"]["tmp_name"], "r")) !== FALSE) {
    $data = array();
    while (($rawdata = fgetcsv($handle, 0, $_POST["delimiter"])) !== FALSE) {
         for ($i=0; $i < count($rawdata); $i++) {
              $data[$i][] = htmlentities(trim($rawdata[$i]), ENT_QUOTES, "UTF-8");
         }
    }
    fclose($handle);
}

但发生的情况是,任何包含特殊字符(例如 ™)的单元格都会被删除/返回为空。

我使用的是 PHP 5.3.13 版

我尝试设置我的locale 并尝试putenv,但这并没有改变任何东西。我还尝试在制作 csv 之前设置我的机器的语言环境设置。 csv 本身是从 Excel 文件创建的。

我检查了我的 csv 编码,它似乎是没有 BOM 的 UTF-8 正确(在 Notepad++ 中检查)。 mb_detect_encoding() 也返回 UTF-8。

当我更改为ENT_IGNORE 时,它只是从我的字符串中删除TM 符号。我尝试了不同的编码类型,例如ISO-8859-15,但无济于事。

str_replace("™", "%99", $row) 只是忽略了TM 符号,让它们保持原样。

我发现很多人对fgetcsv() 和编码/特殊字符有疑问,其中大多数人指的是使用不同的方法,例如fgets()。不幸的是,我也无法使用其他方法,因为我无法在换行符上爆炸,因为某些单元格的内容中可能包含换行符。 如果我能让它起作用,我也会接受不同的方法作为答案。

【问题讨论】:

    标签: php utf-8 html-entities fgetcsv


    【解决方案1】:

    在 for 循环中对我的 rawdata 使用 iconv() 解决了我的问题:

    $data[$i][] = htmlentities(iconv("cp1252", "utf-8", trim($rawdata[$i])), ENT_IGNORE, "UTF-8");
    

    感谢 PHP 聊天中的 @Leigh、Wrikken 和 DaveRando ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2012-02-11
      • 2020-12-09
      • 2017-05-07
      • 1970-01-01
      • 2011-10-11
      • 2017-05-19
      相关资源
      最近更新 更多