节能CSV与PHP UTF-16BE编码(saving CSV with UTF-16BE enco

2019-10-19 23:33发布

我想写一个字符编码从UTF-8编码的MySQL数据库设置为UTF-16BE CSV文件。

我的代码是:

$f = fopen('file.csv', 'w');
$firstLineKeys = false;

// UTF-16BE BOM
fwrite($f, chr(254) . chr(255));

foreach ($lines as $line)
{
    $lineEncoded = [];

    foreach ($line as $key => $value) 
    {
        $key = mb_convert_encoding($key, 'UTF-16BE', "auto");
        $value = mb_convert_encoding($value, 'UTF-16BE', "auto");
        $lineEncoded[$key] = $value;
    }

    if (empty($firstLineKeys))
    {
        $firstLineKeys = array_keys($lineEncoded);

        fputcsv($f, $firstLineKeys);

        $firstLineKeys = array_flip($firstLineKeys);
    }

    fputcsv($f, array_merge($firstLineKeys, $lineEncoded));
}

fclose($f);

当我打开OpenOffice的文件也试图对一个字符集的Unicode的导入,但该领域是一个烂摊子...当我切换输入字符集设置为UTF-8,它看起来是正确的。

任何帮助将apprecated感谢

Answer 1:

$key = mb_convert_encoding($key, 'UTF-16BE', "auto");

(你确定你想是什么?这是一个相当很少使用的编码。Windows的“统一”是UTF-16LE)。

我会避免使用"auto"作为from_encoding。 这是一个不可靠的bodge会经常产生特别是在短字符串错误的结果。 由于输入显然是UTF-8,你应该指出明确代替。

fputcsv($f, array_merge($firstLineKeys, $lineEncoded));

不幸的是fputcsv无法写入一个UTF-16编码的文件。 它使用单字节ASCII逗号/报价/换行符所以它仅适用于那些ASCII超集编码。 所以,如果你想使用它,你会写整个文件为UTF-8,然后转码的整个文件为UTF-16。

你可能要考虑不同的(或自己)的CSV作家代替; 以及作为恼人使用非ASCII编码, fputcsv也是不符合的CSV文件RFC标准,所以你可以很容易地生成文件最CSV耗时的软件无法正常加载。

PHP的内置功能CSV基本上每个人的完全是浪费时间。



文章来源: saving CSV with UTF-16BE encoding in PHP