【问题标题】:Convert encoding of file data using stream_filter_append使用 stream_filter_append 转换文件数据的编码
【发布时间】:2017-10-06 22:38:42
【问题描述】:

我正在尝试在创建过程中使用 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() 的初始文件创建过程中这是否可能。

【问题讨论】:

  • 我不敢相信在发现这一点之前我做了多少测试,但是为什么你会认为在写入数据之后 将过滤器附加到流中会影响数据你已经写了?编写 BOM 后将其移至该行。
  • 是的,就是这样,stream_filter_append() 的位置不正确。谢谢!

标签: php encoding utf-8


【解决方案1】:

@Sammitch 在问题的 cmets 中解决了这个问题。他意识到在写入数据后错误地使用了 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);

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 2011-10-01
    • 2014-03-10
    • 2014-02-17
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多