BOM或\ xFF \ xFE显示在csv文件中

时间:2013-06-27 12:56:59

标签: php csv

需要将数组转换为在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输出就像这样

enter image description here

如您所见,从第二行开始,每个单词前面都有一个字符。当我在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

如何解决这个问题?

2 个答案:

答案 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;