导入 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
我已尝试设置 mylocale
并尝试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()
. 不幸的是,我也无法使用其他方法,因为我无法在换行符上爆炸,因为某些单元格的内容中可能包含换行符。如果我能让它起作用,我也会接受不同的方法作为答案。