导入我的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()
。不幸的是,我无法使其他方法工作,因为我不能在换行符上爆炸,因为某些单元格可能在其内容中包含换行符。
我会接受一种不同的方法作为答案,如果我可以让它发挥作用。
答案 0 :(得分:0)
在for循环中使用我的rawdata上的iconv()
解决了我的问题:
$data[$i][] = htmlentities(iconv("cp1252", "utf-8", trim($rawdata[$i])), ENT_IGNORE, "UTF-8");
感谢来自PHP聊天的@Leigh,Wrikken和DaveRando;)