我从我的Postgres数据库在UTF-8检索数据。db和client_connection的设置是UTF-8格式的。
然后我发送2个报头给访问者:
header("Content-Type: application/msexcel");
header("Content-Disposition: $mode; filename=export.xls");
,并开始以csv方式输出纯文本数据。这将在访问者桌面上打开一个简单的Excel文件。
$cols = array ("col1", "col2", "col3");
echo implode("'t", $cols)."'r'n";
工作正常,直到遇到特殊字符,如:
我试着改变我的client_encoding,同时从数据库检索数据到latin-1,这在大多数情况下有效,但不是所有字符。所以这不是一个解决方案。
我如何将输出文件发送为UTF-8?我不认为将数据从db转换为latin-1是可能的,因为char在latin-1中似乎是未知的…所以我需要Excel将文件处理为UTF-8
我会考虑使用PHPExcel引擎。它使用UTF-8作为默认值,它可以生成一个完整的电子表格文件类型列表(Excel, OpenOffice, CSV等)。
我建议不要发送纯文本并将其伪装成Excel。XLS文件通常是二进制文件,虽然二进制不是必需的,但使用非二进制数据的官方Excel方法是将其格式化为XML。
你在标题中提到了"CSV",但你的问题中没有任何与CSV相关的内容。我提出这个是因为我认为你应该把你的制表符改为逗号,然后你可以简单地输出一个标准的。csv文件,它仍然可以被Excel读取,但不依赖于未记录或不稳定的功能。
如果你真的想发送application/msexcel
,那么你应该使用一个真正的Excel库,因为目前,你正在而不是创建一个真正的Excel文件。
使用;charset=UTF-8后应用程序/xxxxxx我使用:
header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
// header("Content-Length: " . strlen($thecontent)); // this is not mandatory
header('Content-Disposition: attachment; filename="file.xls"');
尝试mb_convert_encoding函数
尝试使用iconv,将字符串转换为所需的字符集
您是否尝试过utf8_encode()字符串?
例如:echo implode("'t", utf8_encode($cols)."'r'n")
不知道这是否可行,但不妨试试