UTF-8 htmlentities和fgetcsv

时间:2013-07-26 14:52:09

标签: php utf-8 html-entities fgetcsv

导入我的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()。不幸的是,我无法使其他方法工作,因为我不能在换行符上爆炸,因为某些单元格可能在其内容中包含换行符。 我会接受一种不同的方法作为答案,如果我可以让它发挥作用。

1 个答案:

答案 0 :(得分:0)

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

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

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