web-dev-qa-db-fra.com

PHP exporter CSV lorsque les données ont des caractères UTF 8

Dans MySQL, j'ai défini mon type de champ de données sur utf8_bin Et je stocke des données en Unicode. Les textes sont correctement affichés dans les pages Web.

Je veux générer un fichier Excel en exportant des données de ma table vers celui-ci. La sortie dans .xls Et .cvs Est - '????'.

Je vérifie d'autres réponses ici, il a été fait référence à des en-têtes:

header("content-type:application/csv;charset=UTF-8");

question similaire . Mais ça ne marche pas. Après avoir utilisé l'en-tête, la sortie csv est - à¤¸à ¥ ‚ठ° à ¥ या.

Veuillez aider. Merci.

9
Sajal

Ce message a résolu mon problème: https://stackoverflow.com/a/4762708/2349494

Et c'est ce qu'a fait la conversion:

print chr(255) . chr(254) . mb_convert_encoding($csv_output, 'UTF-16LE', 'UTF-8');

Auparavant, je recevais des caractères poubelles maintenant les données correctes sont exportées.

19
Sajal

J'ai eu le même problème et je l'ai fait en combinant deux choses:

Tout d'abord, vous devez changer le classement des tables en UTF8, par exemple: "utf8_general_ci" (ou assurez-vous simplement de cela), puis ajoutez ce code après votre requête MySQL:

mysql_query("SET NAMES utf8");

Comme

$result = mysql_query("SHOW COLUMNS FROM table WHERE Field NOT IN ('user_id', 'password')");
mysql_query("SET NAMES utf8");

Et puis, utilisez ceci comme en-tête (adaptez-vous à vos besoins):

header('Content-Description: File Transfer');
header("Content-type: application/vnd.ms-Excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");
header('Content-Transfer-Encoding: binary');
header('Pragma: public');
print "\xEF\xBB\xBF"; // UTF-8 BOM
print $csv_output;
exit;
12
Poorya

J'ai une variante de la réponse de Sajal et je l'ai trouvée sur php.net à: http://www.php.net/manual/en/function.iconv.php#104287

Faites écho au début du contenu du csv:

chr(255).chr(254).iconv("UTF-8", "UTF-16LE//IGNORE", $data)

Je préfère avec iconv() mais il semble que cela fasse la même chose que mb_convert_encoding(). N'oubliez pas de remplacer ; Par des tabulations (\t) Et cela a bien fonctionné pour moi comme ça!

5
ldaguise

Essayez le code suivant;

ob_end_clean();
$_filename = date('Y_m_d_H_i').".csv";

header("Cache-Control: public"); 
header("Content-Type: application/octet-stream");
header("Content-Type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=$_filename");
// Read the file from disk
readfile($filename);
exit();
0
Ashwin Parmar

l'exporter au format XLS (format xml) avec prise en charge unicode, vient d'être testé et fonctionne à 100%

https://code.google.com/p/php-Excel/

0
Zakari