A Microsoft és a Cisco élen jár abban, hogy saját módon értelmezzék a szabványokat, amiket amúgy az egész világ betart. Például ha CSV formátumot szeretnénk használni – amire RFC szabvány is van – akkor a Microsoft kicsit átalakítja a saját szájíze szerint. Például magyar lokalizációs területen SSV lesz belőle (Semicolon Separated Values azaz pontosvessző, Comma azaz vessző helyett). Az idézőjeleket is sajátságosan kezeli, a karakterkódolásról már ne is beszéljünk (persze, hogy Windows-1252 és nem UTF-8, amiben nagy eséllyel az adatbázisban van.
A megoldást ez a weboldal adta meg: https://www.skoumal.net/en/making-utf-8-csv-excel/ köszönet érte. A szokványos PHP-s leírásoktól ez abban tér el, hogy az UTF-8 fájl elejére odateszi a BOM-ot is (Byte Order Mark), aminek köszönhetően az Excel nem fogja valami alien titkosírásnak vélni az amúgy megfelelően formázott szöveget.
header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=export.csv;'); header('Content-Transfer-Encoding: binary'); //open file pointer to standard output $fp = fopen('php://output', 'w'); //add BOM to fix UTF-8 in Excel fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); if ($fp) { fputcsv($fp, array("Cars", "Planes", "Ships"), ";"); fputcsv($fp, array("12", "2", "6"), ";"); fputcsv($fp, array("23", "3", "5"), ";"); fputcsv($fp, array("31", "5", "8"), ";"); } fclose($fp);