我正在尝试从以 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/