php - 在 PHP 中使用 UTF-16BE 编码保存 CSV

标签 php mysql csv unicode encoding

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

如有任何帮助,我们将不胜感激

最佳答案

$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 不仅使用非 ASCII 编码很烦人,而且不符合 CSV 文件的 RFC 标准,因此您可以轻松生成大多数使用 CSV 的软件无法正确加载的文件.

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

关于php - 在 PHP 中使用 UTF-16BE 编码保存 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23229207/

相关文章:

mysql - 修改MySQL语句以按时间间隔过滤数据

php - 避免删除 API 函数中的 SQL 注入(inject)

excel - KDB:将 2 个或更多表保存到同一个 Excel/CSV 文件(添加页眉和/或页脚)?

php - 定位内容图像以进行响应式大小调整

javascript - 使用 jQuery 可排序(不是表单)的 AJAX 发布附加数据

python - 如何使用 Python 在 MySQL 中将列表作为列插入?

Python 和 csv.writer : Open in every loop or keep open?

c - 逐行读取txt文件,如果没有则覆盖,否则追加到文件中

php - 如何在php中维护显示顺序字段

php - 使用 sed 删除第一行代码中 <?php ?> 之间的所有内容(包括 <?php ?>)