yii发送csv文件字符集

时间:2014-07-16 08:19:20

标签: php yii

我使用yii驱动的应用程序。我的目标是编写控制器操作,使用Yii 1.1: csvexportCHttpRequest::sendFile

将一些数据从mongodb导出到csv文件

我的代码:

public function actionCatalogDataExport( $catalog_id )
{
    // prepare all needed variables here
    $data = ..., $headers = ..., $filename = ...     

    Yii::import('ext.csv.ECSVExport');
    $csv = new ECSVExport($data);
    $output = $csv->setHeaders($headers)->setDelimiter(',')->toCSV();
    Yii::app()->getRequest()->sendFile($filename, $output, "text/csv", true);
}

此脚本正常运行,但如果我通过Excel打开生成的文件,我会看到类似的内容:

enter image description here

文件编码存在一些问题...我打开了notepad ++并将编码更改为UTF-8而没有BOM,现在文件看起来不错(语言:Ru):

enter image description here

测试了此修复但未取得成功的结果:

header('Content-type: text/csv; charset=UTF-8'); // no effect

Yii::app()->getRequest()->sendFile(
    $filename, 
    $output, 
    "text/csv; charset=UTF-8", // no effect
    true
);

如何在yii发送文件操作后立即实现此目的?

2 个答案:

答案 0 :(得分:1)

尝试将编码添加到csv文件的开头,如下所示:

$encode = "\xEF\xBB\xBF"; // UTF-8 BOM
$content = $encode . $csv->toCSV();

//var_dump($content);
Yii::app()->getRequest()->sendFile($filename, $content, "text/csv; charset=UTF-8", false);

答案 1 :(得分:0)

默认设置参数,Excel for Windows使用windows-1251编码打开csv文件。如果我需要使用此编码生成正确的数据值,我必须使用iconv

foreach( $data as $key => &$value ) {
    $value = iconv('UTF-8', 'windows-1251', $value);
}

// send file to user...
// ...and it works as I need.