header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");
这一切似乎都具有预期的效果,除了Excel(Mac,2008年)不想正确导入。 Excel中没有“以UTF-8格式打开”之类的选项,所以……我有点恼火。
我似乎在任何地方都找不到任何明确的解决方案,尽管有很多人遇到同样的问题。我最常看到的是包含BOM,但我无法确切地知道如何做到这一点。正如您在上面看到的那样,我只是在
echo
输入这些数据,所以我没有写任何文件。如果需要的话,我可以做到这一点,因为那时候似乎没有必要。有任何帮助吗?更新:我尝试将BOM表作为
echo pack("CCC", 0xef, 0xbb, 0xbf);
回显,这是我从试图检测BOM表的站点提取的。但是Excel导入时,只是将这三个字符附加到第一个单元格中,而仍然弄乱了特殊字符。#1 楼
引用Microsoft支持工程师的话,Excel for Mac当前不支持UTF-8
更新,2017年:所有人都适用Office 2016之前的Microsoft Excel for Mac版本。较新版本(来自Office 365)现在支持UTF-8。
为了输出UTF-8内容,Windows和OS X上的Excel都将要成功阅读,您需要做两件事:
请确保将UTF-8 CSV文本转换为UTF-16LE
mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
确保将UTF-16LE字节顺序标记添加到文件的开头
chr(255) . chr(254)
仅在OS X(而不是Windows)上使用Excel时出现的下一个问题将是在查看带有逗号分隔值的CSV文件时,Excel将仅用一行显示行,而所有文本以及中的逗号第一行。
避免这种情况的方法是使用制表符作为分隔值。
我从PHP注释(使用制表符“ \ t”代替逗号),并且在OS X和Windows Excel上都可以正常使用。
请注意,要解决将空列作为行尾的问题,我确实必须更改以下代码行:
$field_cnt = count($fields);
到
$field_cnt = count($fields)-1;
本页上的其他评论说,其他电子表格应用程序(例如OpenOffice Calc,Apple自己的Numbers和Google Doc的电子表格)对带有逗号的UTF-8文件没有问题。
请参阅此问题中的表格以了解有效的方法而且不适用于Excel中的Unicode CSV文件。
作为补充,我可能要补充一点,如果您使用的是Composer,则应该看看是否将
League\Csv
添加到您的需求中。 League\Csv
具有用于构建CSV文件的非常好的API。要使用
League\Csv
和这种创建CSV文件的方法一起使用,请查看此示例评论
叫我愚蠢,但我无法完成这项工作。我使用mb_convert_encoding函数转换了数据,并在文件内容之前输出了BOM表,但是当我在Excel中打开文件时,只得到了一行汉字。我现在仍在使用逗号而不是制表符,但是大概不应该引起我的注意。
–约翰·里克斯(John Rix)
2014年8月11日22:38
@JohnRix这很奇怪。这段代码从字面上解决了我导出CSV文件时遇到的每个问题-除了仅接受逗号的进口商以外。您能给我发送您正在使用的代码的粘贴框,以及要转换为CSV的数组和导出文件的副本吗?
–蒂姆·格罗内维尔德
2014年8月12日,0:22
此解决方案还为我在Mac和Windows上解决了UTF8问题。我还发现用sep =;添加一行。或sep =,该CSV文件将告诉Excel如何分隔CSV并重新正确创建列。
–吕克·沃兰茨(Luc Wollants)
2014年11月13日14:05
我发现如果我仅以BOM表开头字符串,那么事情就会出现乱码,然后在另一行添加“ sep =,\ n”,然后在另一行添加数据。如果我在一行中完成所有操作,一切都会很好($ csv = chr(255)。chr(254)/ * BOM * /。“ sep =,\ n”。mb_convert_encoding($ csv,'UTF-16LE',' UTF-8');)。现在在Mac上一切看起来都很棒。我没有Windows可以测试。
– Tremby
2014-12-24在2:24
只有对我完全有效的东西。微软的前后矛盾使我惊叹不已。保存普通的csv文件使用“,”作为分隔符,但是如果存在BOM表,则出于某种原因使用“ \ t”保存。 .csv中的C代表“ COMMA”该死。确实并不难。
–菲尔
2015年10月20日在8:11
#2 楼
我有相同(或相似)的问题。,如果我在输出中添加BOM,则可以正常工作:
header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
我相信这是一个非常难看的骇客,但至少对Excel 2007 Windows而言,它对我有用。不确定它是否可以在Mac上运行。
评论
丑陋,但超级有帮助。谢谢。
– abelito
2011-11-26 20:19
我很确定这在OS X上根本无法正常工作。我认为导入时它实际上可能显示BOM(警告:朦胧的记忆。)
– davidtbernal
2012年1月31日下午5:16
这是对的。至少,像上面的示例一样,我尝试使用BOM作为前缀,但确实确实在开始时显示了一些时髦的字符,并始终显示错误的特殊字符(在Excel 2011中进行了测试)。在所有设置下,这似乎最适合我:stackoverflow.com/a/1648671/1005334(使用PHP)。
– kasimir
2012年3月20日13:22
我不断收到有关此问题的警报,因为显然很多其他人偶然发现了该问题。我希望我可以将其标记为正确,因为它已经被很多人赞成。不幸的是,我终于对此解决方案做了个尝试(很久以前放弃了该项目),并且在Mac的Excel 2008中对我不起作用。很高兴为您工作。我已提出解决方案。但是它不能解决Excel for Mac 2008问题。如果有人在Mac上运气好的话,一定要让我(显然是所有人)知道。
– Ben Saufley
2012年5月31日在22:36
可以很好地将CSV文件输出到MS Excel Starter2010。非常感谢!
–杰米·德克斯特(Jamie Dexter)
13年2月7日在12:08
#3 楼
这是我的操作方法(这是提示浏览器下载csv文件的方法):header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();
唯一可以解决的问题是在碰到空格时CSV预览中的UTF8编码问题在Mac上没有..但在Excel Mac 2008中没有...不知道为什么
评论
代码的UTF-8 BOM行通过导出到xls节省了我的时间
–Mladen Janjetovic
2014年3月28日14:23在
当我遇到这篇文章时,我一直在寻找一种以utf8格式直接输出到浏览器的方法,这是我的解决方案,其中包含BOM和二进制传输标头的信息。 $ outstream = fopen(“ php:// output”,'w'); fputs($ outstream,“ \ xEF \ xBB \ xBF”); foreach($ export as $ fields){fputcsv($ outstream,$ fields); } fclose($ outstream);
– B
2014年5月15日在18:26
错别字-删除双))。
–sitilge
15年6月2日在8:19
#4 楼
我只是处理了相同的问题,并提出了两种解决方案。使用bpeterson76建议的PHPExcel类。
使用此类生成了最广泛兼容的文件,我能够从UTF-8编码的数据生成一个文件,该数据可以在Excel 2008 Mac,Excel 2007 Windows和Google Docs中很好地打开。
使用PHPExcel的最大问题是它运行缓慢且占用大量内存,这对于大小合理的文件而言不是问题,但是如果您的Excel / CSV文件具有数百行或数千行,则该库将变得不可用。
这是一个PHP方法,将获取一些TSV数据并将Excel文件输出到浏览器,请注意,它使用Excel5 Writer,这意味着该文件应与旧版本的Excel兼容,但是我再也无法访问任何文件,因此无法对其进行测试。
function excel_export($tsv_data, $filename) {
$export_data = preg_split("/\n/", $tsv_data);
foreach($export_data as &$row) {
$row = preg_split("/\t/", $row);
}
include("includes/PHPExcel.php");
include('includes/PHPExcel/Writer/Excel5.php');
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$sheet = $objPHPExcel->getActiveSheet();
$row = '1';
$col = "A";
foreach($export_data as $row_cells) {
if(!is_array($row_cells)) { continue; }
foreach($row_cells as $cell) {
$sheet->setCellValue($col.$row, $cell);
$col++;
}
$row += 1;
$col = "A";
}
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
exit;
}
由于PHPExcel的效率问题,我还不得不弄清楚如何生成UTF-8 &Excel兼容CSV或TSV文件。
我能想到的最好的是与Excel 2008 Mac和Excel 2007 PC兼容的文件,但与Google Docs兼容,这对于我的应用程序已经足够了。
我在这里找到了解决方案,特别是这个答案,但是您也应该阅读已接受的答案,因为它可以解释问题。
这是我使用的PHP代码,请注意,我正在使用tsv数据(使用制表符作为分隔符而不是逗号):
header ( 'HTTP/1.1 200 OK' );
header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Content-Type: application/vnd.ms-excel') ;
header ( 'Content-Disposition: attachment;filename=export.csv' );
print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
exit;
评论
我在Windows-7 Excel 2007上遇到相同的问题,并尝试了所有建议,但失败了:(
–PHP Ferrari
2012年11月23日16:16
UTF-16LE解决方案是可行的。请注意,您必须正确设置tsv的格式,并且必须将其设置为tsc,因此制表符分隔而不是逗号分隔。另请参阅Marc的帖子:stackoverflow.com/a/1648671/1697370
–埃勒特·范·科珀伦
2014-12-5 12:17
#5 楼
我遇到了相同的问题,如下所示解决了问题: header('Content-Encoding: UTF-8');
header('Content-Type: text/csv; charset=utf-8' );
header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
$df = fopen( 'php://output', 'w' );
//This line is important:
fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!
foreach ( $rows as $row ) {
fputcsv( $df, $row );
}
fclose($df);
exit();
#6 楼
在我的情况下,下面的方法非常适合使带有UTF-8字符的CSV文件在Excel中正确显示。$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);
BOM表标题将使Excel知道正确的编码。 评论
大为您兄弟<3
– Adrien G
18年11月26日在17:46
fprintf($ out,chr(0xEF).chr(0xBB).chr(0xBF)); <-这正是我所需要的。它像一种魅力。
– Alex
19年7月16日在10:52
谢谢花花公子,这只是工作正常,而其他解决方案则没有。
–spetsnaz
12月2日9:35
#7 楼
Excel不支持UTF-8。您必须将UTF-8文本编码为UCS-2LE。mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');
评论
如上面建议的那样,最好使用UTF-16LE,它涵盖了存在的每个字符。
–埃勒特·范·科珀伦
2014年12月5日12:16
我注意到mb_convert_encoding可以正常工作,并且在导出的XLS文件中正确显示了变音符号。我有mysql默认配置和apache + php设置为可与utf-8一起使用
–麦耶少年
2015年10月13日14:56
#8 楼
要对此进行跟进:问题似乎出在Mac上的Excel。这不是我生成文件的方式,因为即使从Excel生成CSV也会破坏它们。我另存为CSV,然后重新导入,所有字符都弄乱了。
所以…似乎没有正确的答案。感谢所有建议。
我要说的是,我读过的所有内容中,@ Daniel Magliola关于BOM的建议可能是其他计算机的最佳答案。但这仍然不能解决我的问题。
评论
由于Mac和Windows在UTF8支持方面不一致,因此最好的选择是完全使用其他编码。我发现cp1252通常可以很好地与Microsoft兼容。 zh.wikipedia.org/wiki/Windows-1252
– s29
13年2月4日在3:27
Ben,这个问题的答案正确:)见我的!
–蒂姆·格罗内维尔德
2014年2月9日在7:54
#9 楼
在Windows和Mac OS上的excel中都可以正常工作。修复了excel中不显示包含变音符号,西里尔字母,希腊字母和货币符号的字符的问题。
function writeCSV($filename, $headings, $data) {
//Use tab as field separator
$newTab = "\t";
$newLine = "\n";
$fputcsv = count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';
// Loop over the * to export
if (! empty($data)) {
foreach($data as $item) {
$fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
}
}
//Convert CSV to UTF-16
$encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');
// Output CSV-specific headers
header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. strlen($encoded_csv));
echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
exit;
}
评论
这个解决方案使我也可以使导出工作适用于Google表格(其他一些失败)
– Cafn
18/09/19在10:51
该解决方案几乎是完美的,当一个单元格包含双引号“时,我才发现一个问题,它被跳过了。
–皮埃尔
12月4日9:05
#10 楼
CSV文件包含一个字节顺序标记。或者按照建议的解决方法,只需在HTTP正文中回显它即可。
#11 楼
添加:fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
或:
fprintf($file, "\xEF\xBB\xBF");
将任何内容写入CSV文件之前。
示例:
<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);
#12 楼
不需要使用mb_convert_encoding
转换已经utf-8编码的文本。只需在原始内容前面添加三个字符:$newContent = chr(239) . chr(187) . chr(191) . $originalContent
对我来说,这解决了csv文件中特殊字符的问题。
评论
难以置信的;我尝试了至少10种其他解决方案,当通过fputs与UTF-8 BOM结合使用时,对我来说唯一的解决方案似乎就是这种解决方案。
–kaarto
18/12/14在10:12
这些字符是什么?必须是一些魔法。在这里尝试所有其他答案后,只有对我有用的解决方案。
–leymannx
8月17日21:36
这些字符组合在一起称为“字节对象标记”,它告诉应用程序检查它的其余内容应被视为UTF-8。
– Rvanlaak
10月15日12:55
#13 楼
由于UTF8编码不适用于Excel。您可以使用iconv()
将数据转换为其他编码类型。例如
iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),
评论
这是唯一适用于Excel Mac 2011的解决方案
–克里斯特·弗恩斯特罗姆(Christer Fernstrom)
16 Sep 19 '17:39
#14 楼
您可以使用iconv转换CSV字符串。例如:
$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );
评论
很棒的示例文本;)
– ngeek
16年7月8日在7:22
#15 楼
经过调查,我发现UTF-8在MAC和Windows上无法正常工作,因此我尝试在Windows-1252上对它们进行很好的支持,但是您必须在ubuntu上选择编码类型。这是我的代码
$valueToWrite = mb_convert_encoding($value, 'Windows-1252');
$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
$response->headers->set('Pragma', 'public');
$response->headers->set('Content-Endcoding','Windows-1252');
$response->headers->set('Cache-Control', 'maxage=1');
$response->headers->set('Content-Disposition', $dispositionHeader);
echo "\xEF\xBB\xBF"; // UTF-8 BOM
#16 楼
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.
function generateCSVFile($filename, $headings, $data) {
//Use tab as field separator
$newTab = "\t";
$newLine = "\n";
$fputcsv = count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';
// Loop over the * to export
if (! empty($data)) {
foreach($data as $item) {
$fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
}
}
//Convert CSV to UTF-16
$encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');
// Output CSV-specific headers
header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. strlen($encoded_csv));
echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
exit;
}
评论
通常,如果答案包括对代码意图的解释,以及为什么在不引入其他代码的情况下解决问题的原因,则答案会更有帮助。
–蒂姆·迪克曼(Tim Diekmann)
18-3-27的14:00
#17 楼
仅输出Excel本身怎么样?这是一个非常好的类,它允许您在服务器端生成XLS文件。对于那些无法“弄清楚” csv的客户,到目前为止,我从未经常使用它。它还允许csv永远不会做的一些额外的格式化(阴影,行高,计算等)。评论
请注意,phpexcel在大量数据方面存在问题。
–埃勒特·范·科珀伦
2014年12月5日,12:22
#18 楼
您必须使用编码“ Windows-1252”。 header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");
也许您必须转换字符串:
private function convertToWindowsCharset($string) {
$encoding = mb_detect_encoding($string);
return iconv($encoding, "Windows-1252", $string);
}
#19 楼
您可以在导出之前将3个字节附加到文件中,它对我有用。在执行该操作之前,该系统只能在Windows和HP -UX上运行,但在Linux上无法运行。FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );
在以下位置具有UTF-8 BOM(3字节,十六进制EF BB BF)文件的开始。否则,Excel将根据您区域设置的默认编码(例如cp1252)而不是utf-8解释数据。
为Excel生成CSV文件,如何在值中包含换行符
#20 楼
我在Mac上,就我而言,只需用"sep=;\n"
指定分隔符,然后将文件编码为UTF-16LE即可,如下所示:$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
#21 楼
对我而言,以上解决方案均无效。以下是我为解决此问题所做的事情:使用PHP代码中的此函数修改值:
$value = utf8_encode($value);
在excel工作表中此输出值正确。
#22 楼
当我有导入数据的Excel VBA例程时,我遇到了同样的问题。由于CSV是纯文本格式,因此我通过在简单的文件编辑器(如写字板)中以编程方式打开数据,然后将其重新保存为Unicode文本,或从那里复制到剪贴板并将其粘贴到Excel来解决此问题。如果excel不能自动将CSV解析为单元格,则可以使用内置的“从文本到列”功能轻松地对此进行补救。评论
我已经尝试过了!但是它已经被编码为unicode文本…将其保存为unicode文本不会改变任何内容。在不正确解释所有特殊字符的情况下,如何将其保存为纯文本?
– Ben Saufley
2010年12月3日,18:55
我认为通过“将其保存为Unicode文本”,Alain可能意味着“ UTF-16LE”。 Windows经常(很难)使用“ Unicode”错误地引用带有领先BOM的UTF-16LE或UTF-16LE。记事本的“文件”->“保存”对话框以这种方式使用“ Unicode”。
–Thanatos
2010-12-5 7:16
#23 楼
当您将其另存为.txt文件并将其在excel中以逗号作为定界符打开时,是否还会出现问题?问题可能根本不是编码,可能仅仅是根据excel标准,文件不是完美的CSV。
评论
据我所知,CSV格式很好。我可以在TextEdit中制作一个“完美”的CSV,没问题,甚至可以将txt重命名为csv,因此它不会丢失任何秘密-CSV只是文本文件。此外,格式在Excel中非常完美,只是打破了特殊字符。但是以防万一,我尝试了您的建议,可悲的是产生了同样的问题。
– Ben Saufley
2010年12月3日,19:46
从“他们正在思考的WTF”部分中:请注意,根据Microsoft,正确的字段分隔符取决于语言环境。 “逗号分隔”文件可能要求在某些区域设置中将字段实际用分号分隔-除了建议使用OpenOffice外,您无能为力
– djn
2010-12-5在3:39
那真是太疯狂了-不幸的是,我没有遇到适当地划界的麻烦。我只是遇到这些特殊字符的麻烦。
– Ben Saufley
2010-12-04 21:42
#24 楼
这篇文章已经很老了,但是经过数小时的尝试,我想分享我的解决方案……也许它可以帮助处理Excel,Mac和CSV的人发现这一威胁。我正在考虑使用Excel Users作为数据库的输出动态生成csv。 (带有BOM的UTF-8)我尝试了很多iconv,但是在Mac Excel 2004中无法使用德语变音符号。一种解决方案:PHPExcel。很好,但是对我的项目来说太多了。对我有用的是创建csv文件,并使用以下PHPsnippet将csv文件转换为xls:csv2xls。结果xls与excel德国变音符(ä,ö,Ü,...)。
#25 楼
我只是尝试了这些标头,并在Windows 7 PC上安装了Excel 2013,以正确导入带有特殊字符的CSV文件。字节顺序标记(BOM)是使其起作用的最终密钥。header('Content-Encoding: UTF-8'); header('Content-type: text/csv; charset=UTF-8'); header("Content-disposition: attachment; filename=filename.csv"); header("Pragma: public"); header("Expires: 0"); echo "\xEF\xBB\xBF"; // UTF-8 BOM
评论
是的,这是正确的,它将在Windows的Excel中正常运行,但是如我的回答所述,它将无法在OS X的Excel中运行。
–蒂姆·格罗内维尔德
13年8月18日在0:03
#26 楼
否则,您可以:header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");
echo utf8_decode($output);
#27 楼
适用于Mac Excel 2008的EASY解决方案:我为此苦苦挣扎了很多次,但这是我的简单解决方法:
在Textwrangler中打开.csv文件,该文件应正确打开您的UTF-8字符。现在,在底部状态栏中,将文件格式从“ Unicode(UTF-8)”更改为“ Western(ISO Latin 1)”并保存文件。
现在转到Mac Excel 2008,然后选择“文件”>“导入”>选择csv>查找文件>在“文件源”中选择“ Windows(ANSI)”,瞧,UTF-8字符正确显示。至少对我有用...
#28 楼
我使用了它,而且效果很好header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
$rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];
$arr1[]["title"] = $rcontent;
}
} else {
echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
fputcsv($output, $result1);
endforeach;
#29 楼
#在PHP中输出Excel可以正确读取的UTF-8 CSV。//Use tab as field separator
$sep = "\t";
$eol = "\n";
$fputcsv = count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';
评论
一个人一个答案就足够了。以后请记住,您可以随时将信息添加到答案中,无需创建2
–RiggsFolly
17-10-5在11:11
#30 楼
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));
评论
这个问题不问如何转换,而是问如何输出。此贡献的相关部分(以UTF-16输出)已在“选定答案”中进行了贡献。
– Ben Saufley
2015年1月8日在16:45
@BenSaufley好吧,但是它用两行简单的代码解决了问题
– b3wii
2015年1月9日在8:30
这个问题已经解决,并且也进行了更彻底的解释。
– Ben Saufley
2015年1月9日,12:13
评论
Excel没有提供调整传入文件字符集的选项?您对此有100%的把握吗?我没有复印件,所以无法尝试,但我想那儿肯定有一个下拉框。这是Mac上的Excel-似乎比PC上的Excel更受限制。在“打开”对话框中根本没有下拉列表,除了这些下拉列表之外,还可以打开其他文件类型。我到处都看过。如果在那里,那是晦涩的。我会说98%肯定。
Microsoft Office还是Openoffice?
微软在这方面做得更好,没有办法(我发现)让OpenOffice检测字符集,甚至BOM。哎哟,
BOM对Mac的Microsoft Excel 2008也不起作用。