web-dev-qa-db-fra.com

en-tête php Excel et utf-8

ob_start();

echo 'Désçàui';

header("Content-Type:   application/vnd.ms-Excel; charset=utf-8");
header("Content-type:   application/x-msexcel; charset=utf-8");
header("Content-Disposition: attachment; filename=Test.xls"); 
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); 

ob_end_flush();

Ce que je reçois dans le fichier Excel est Désçàui

Cependant, je reçois Désçàui quand j'essaie

ob_start();
echo 'Désçàui';
header("Content-Type:   text/html; charset=utf-8");
ob_end_flush();

Des experts de l'aide?

PS. Le fichier est enregistré dans DW avec Titre/Encodage Unicode (Utf-8).

18
Jeremy Roy

Je ne suis pas sûr, mais il se peut qu'Excel ne puisse pas gérer utf8 (peut dépendre de la version). Mais il peut gérer utf16, essayez donc de convertir le jeu de caractères . Cela fonctionne pour moi (sous Excel2002):

echo mb_convert_encoding('Désçàui','utf-16','utf-8');
18
Dr.Molle

Je ne sais pas comment vous générez le fichier Excel. Toutefois, si vous le faites à partir d’une sortie HTML, vous pouvez simplement ajouter ce qui suit au début:

<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />

Cordialement

19
gonetil

Source http://www.mwasif.com/2007/5/download-data-csv-using-php/

La solution a fonctionné pour moi

Danois Zahour a dit:

7 octobre 2009 à 19h23

Si votre contenu est au format UTF-8, inutile de convertir le codage. Il suffit de démarrer votre flux de fichier/sortie avec la nomenclature UTF-8 après les en-têtes.

echo pack("CCC",0xef,0xbb,0xbf);

Et en-tête doit contenir le codage UTF-8

header( "Content-type: application/vnd.ms-Excel; charset=UTF-8" );

Cela fonctionnera comme un charme car Excel reconnaîtra le jeu de caractères avec les octets de la nomenclature.

19
Asif

Cette ligne de code de nomenclature UTF-8 a bien fonctionné avec mes caractères UTF-8:

 header("Content-type: application/vnd.ms-Excel");
 header("Content-Disposition: attachment; filename='".$file_name."'");
 header("Pragma: no-cache");
 header("Expires: 0");
 echo "\xEF\xBB\xBF"; //UTF-8 BOM
 echo $out;
9
Mladen Janjetovic

Les en-têtes content-type ne concernent que le navigateur. Ils n'ont aucun effet sur les fichiers téléchargés. Une fois le fichier enregistré, il appartient à l’application de décider de la manière dont elle traite les données du fichier.

L'exemple que vous montrez n'est pas un fichier Excel valide. Lorsque vous rencontrez un fichier défectueux, Excel passe probablement à un traitement par défaut qui suppose windows-1252 ou à un autre jeu de caractères à un octet.

Vous devrez donner à Excel un fichier approprié à ouvrir. Alternativement, il peut être possible d'utiliser l'ancienne astuce "Sortie HTML mais enregistrer sous XLS" et spécifier un codage UTF-8 dans ce fichier HTML. 

3
Unicron

La conversion de utf8 en entités html a bien fonctionné pour moi:

$str = 'utf-string ...';
if (mb_detect_encoding($str ) == 'UTF-8') {
   $str = mb_convert_encoding($str , "HTML-ENTITIES", "UTF-8");
}

header('Content-type: application/x-msdownload; charset=utf-16');
header('Content-Disposition: attachment; filename=companies.xls');
header('Pragma: no-cache');
header('Expires: 0');

echo $str ; 
2
Smokie

essaye ça

<?php
header("Content-Type: application/vnd.ms-Excel");
header('Content-Disposition: attachment; filename="sample.xls"');
echo "
    <html xmlns:o=\"urn:schemas-Microsoft-com:office:office\" xmlns:x=\"urn:schemas-Microsoft-com:office:Excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">
    <html>
        <head><meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" /></head>
        <body>
";

echo "
    <table>
      <tr>
        <th rowspan=\"2\" nowrap=\"nowrap\">เลขที่บัญชี</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">ชื่อ-สกุล ลูกค้า</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">OS/Balance</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">วันที่</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">เวลา</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">Action Code</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">Amount</th>
        <th colspan=\"5\" nowrap=\"nowrap\">ผลการติดตาม</th>
      </tr>
      <tr>
        <th nowrap=\"nowrap\">ที่อยู่บ้าน</th>
        <th nowrap=\"nowrap\">เบอร์โทรบ้าน</th>
        <th nowrap=\"nowrap\">เบอร์โทรมือถือ</th>
        <th nowrap=\"nowrap\">ที่อยู่ที่ทำงาน</th>
        <th nowrap=\"nowrap\">เบอร์โทรที่ทำงาน</th>
      </tr>
      <tr>
        <td>acc</td>
        <td>name</td>
        <td>balance</td>
        <td>date</td>
        <td>time</td>
        <td>code</td>
        <td>amount</td>
        <td>h-addr</td>
        <td>h-tel</td>
        <td>cell</td>
        <td>w-addr</td>
        <td>w-tel</td>
      </tr>
    </table>
";

echo "</body></html>";

?>
1
Manee Mana

Essaye ça:

header('Content-Transfer-Encoding: binary');
header("Content-Type: application/octet-stream"); 
header("Content-Transfer-Encoding: binary"); 
header('Expires: '.gmdate('D, d M Y H:i:s').' GMT'); 
header('Content-Disposition: attachment; filename = "Export '.date("Y-m-d").'.xls"'); 
header('Pragma: no-cache'); 

//these characters will make correct encoding to Excel 
echo chr(255).chr(254).iconv("UTF-8", "UTF-16LE//IGNORE", $out); 
0
EkoDrive