1

需要转换数组以显示在 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 get 中复制字符时

如果 remove \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

如何解决这个问题?

4

2 回答 2

3

UTF-16 编码文本块需要以 BOM 开头。BOM 不得在文本本身中重复。您当前正在为每一行输出一个 BOM。不要那样做,只需在文件开头输出一次。

于 2013-06-27T13:02:25.820 回答
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;
于 2013-06-27T13:04:31.790 回答