php header excel和utf-8

时间:2011-03-20 11:21:37

标签: php 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();

我在excel文件中获得的是Désçàui

然而,当我尝试

时,我确实得到了Désçàui
ob_start();
echo 'Désçàui';
header("Content-Type:   text/html; charset=utf-8");
ob_end_flush();

任何帮助专家?

PS。该文件以标题/编码Unicode(Utf-8)保存在DW中。

8 个答案:

答案 0 :(得分:20)

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

解决方案为我工作

Danish Zahur说,

2009年10月7日@ 7:23 pm

如果您的内容采用UTF-8格式,则无需转换编码。只需在标题后用UTF-8 BOM启动文件/输出流。

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

标题应包含UTF-8编码

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

它将像魅力一样工作,因为Excel将识别具有BOM字节的文件字符集。

答案 1 :(得分:20)

我不知道你是如何生成excel文件的。但是,如果您是从HTML输出中执行此操作,则可以在开头添加以下内容:

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

此致

答案 2 :(得分:18)

我不确定,但可能是excel无法处理utf8(可能取决于版本)。但它可以处理utf16,所以尝试转换字符集。 这对我有用(在excel2002中):

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

答案 3 :(得分:9)

这条UTF-8 BOM代码行使我的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;

答案 4 :(得分:3)

content-type标题仅与浏览器相关。它们对下载的文件没有影响。保存文件后,由应用程序决定如何处理文件中的数据。

您显示的示例首先不是有效的Excel文件。当遇到它必须认为是一个损坏的文件时,Excel可能会切换到一些假定为windows-1252或其他单字节字符集的默认处理。

您必须为Excel提供正确的文件才能打开。或者,也可以使用旧的“输出HTML但另存为XLS”技巧,并在该HTML文件中指定UTF-8编码。

答案 5 :(得分:2)

将utf8转换为html-entities非常适合我:

$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 ; 

答案 6 :(得分:1)

试试这个

<?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>";

?>

答案 7 :(得分:0)

试试这个:

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);