需要将数组转换为在csv文件中显示
以下是示例代码
$output=array(
array('firstname' => 'latviešu', 'lastname' => 'Johnson', 'age' => 25),
array('firstname' => 'русский', 'lastname' => 'latviešu', 'age' => 25),
array('firstname' => 'šAmanda', 'lastname' => 'Miller', 'age' => 18),
array('firstname' => 'english', 'lastname' => 'русский', 'age' => 25.04),
);
header('Pragma: public');
header('Content-type: application/x-msexcel');
header('Content-Disposition: attachment; filename="utf8_bom.xls"');
foreach($output as $row) {
$implode = (implode("\t", $row)). "\r\n" ;
$implode = mb_convert_encoding($implode, 'UTF-16LE', 'UTF-8');
echo $implode = "\xFF\xFE" . $implode;
}
csv输出就像这样
如您所见,从第二行开始,每个单词前面都有一个字符。当我在html中复制该字符时获取
。
如果删除\xFF\xFE
,则没有此类字符,但文本通常不可读。试过trim
,但通常也不可读。
如何删除该字符?
解决方案
这是最后的解决方案
foreach($output as $row) {
if(!$flag) {
$implode = (implode("\t", array_keys($row))). "\r\n" ;
$implode = mb_convert_encoding($implode, 'UTF-16LE', 'UTF-8');
echo $implode = "\xFF\xFE" . $implode;
$flag = true;
}
$implode = (implode("\t", array_values($row))). "\r\n" ;
$implode = mb_convert_encoding($implode, 'UTF-16LE', 'UTF-8');
echo $implode;
}
但接下来的问题与代码有关......
数组array('firstname' => 'english', 'lastname' => 'русский', 'age' => 25.04),
的末尾是25.04
;但是在csv中获取25.Apr
如何解决这个问题?
答案 0 :(得分:3)
UTF-16编码文本块需要以BOM开头。不得在文本中重复BOM。您当前正在为每一行输出BOM。不要这样做,只需在文件开头输出一次。
答案 1 :(得分:1)
我认为您需要在文件的开头添加BOM,但mb_convert_encoding
会在每行添加它。如果可能的话,试试这个:
$utf = '';
foreach($output as $row) {
$utf .= (implode("\t", $row)). "\r\n" ;
}
$utf = mb_convert_encoding($implode, 'UTF-16LE', 'UTF-8');
echo $utf;