UTF-8 htmlentities and fgetcsv


UTF-8 htmlentities and fgetcsv

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

这是启示代码:

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(在记事本++中检查(。 mb_detect_encoding()也返回UTF-8 .

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

str_replace("™", "%99", $row)只是忽略了TM符号并保留它们。

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

在 for 循环中使用我的原始数据iconv()解决了我的问题:

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

谢谢@Leigh,Wrikken和DaveRando来自PHP聊天;)