使用stream_filter_append转换文件数据的编码

时间:2017-10-06 22:38:43

标签: php encoding utf-8

我正在尝试使用stream_filter_append()在创建过程中将我创建的文件转换为UTF-16LE。但是,我只是从输出中获取乱码数据。下面的示例代码

    $fp = fopen($filename, "w");
    fwrite($fp, chr(255) . chr(254));
    $rows = array(array('Состав Gerber', 'Секреты производства'), array('Полезные аксессуары', 'Инструменты'));
    foreach($rows as $row)
    {
        fputcsv($fp, array_values($row));
    }
    stream_filter_append($fp, 'convert.iconv.UTF-8/UTF-16LE', STREAM_FILTER_WRITE);
    fclose($fp);

在通过fputcsv传递之前,我无法在数据上使用iconv,因为fputcsv不会处理UTF-16。 saving CSV with UTF-16BE encoding in PHP

我知道我可以选择创建文件,然后阅读并转换它。甚至创建一个自定义fputcsv来处理UTF-16。但我想知道在初始文件创建过程中使用stream_filter_append()是否可行。

1 个答案:

答案 0 :(得分:0)

这是由@Sammitch在问题的评论中解决的。他意识到在写入数据后错误地使用了stream_filter_append()的位置。它应该在写之前使用。下面是一个正确的例子。

$fp = fopen($filename, "w");
fwrite($fp, chr(255) . chr(254));
stream_filter_append($fp, 'convert.iconv.UTF-8/UTF-16LE', STREAM_FILTER_WRITE);
$rows = array(array('Состав Gerber', 'Секреты производства'), array('Полезные аксессуары', 'Инструменты'));
foreach($rows as $row)
{
    fputcsv($fp, array_values($row));
}
fclose($fp);