【问题标题】:saving CSV with UTF-16BE encoding in PHP在 PHP 中使用 UTF-16BE 编码保存 CSV
【发布时间】:2014-04-22 20:09:17
【问题描述】:

我正在尝试从以 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 时,它看起来是正确的。

任何帮助将不胜感激,谢谢

【问题讨论】:

    标签: php mysql csv unicode encoding


    【解决方案1】:
    $key = mb_convert_encoding($key, 'UTF-16BE', "auto");
    

    (您确定要 BE?这是一种很少使用的编码。Windows“Unicode”是 UTF-16LE。)

    我会避免使用"auto" 作为from_encoding。这是一个不可靠的错误,通常会产生错误的结果,尤其是在短弦上。由于输入显然是 UTF-8,因此您应该明确说明。

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

    很遗憾,fputcsv 无法写入 UTF-16 编码的文件。它使用单字节 ASCII 逗号/引号/换行符,因此它仅适用于作为 ASCII 超集的编码。因此,如果您想使用它,您必须将整个文件写入 UTF-8,然后将整个文件转码为 UTF-16。

    您可能需要考虑换用其他(或您自己的)CSV 编写器; fputcsv 不符合 CSV 文件的 RFC 标准,而且使用非 ASCII 编码很烦人,因此您可以轻松生成大多数 CSV 消耗软件无法正常加载的文件。

    PHP 内置的 CSV 函数本质上完全是在浪费大家的时间。

    【讨论】:

    • 怎么不符合标准?
    • 只要您使用fputcsv($handle, $array, ',', '"', "\0"),它就应该正确地转义所有内容(在阅读链接的错误之后)。 fgetcsv 似乎是另一回事
    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2012-12-04
    • 2014-06-21
    • 2020-11-07
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多