当前位置: 首页 > 知识库问答 >
问题:

PHP导出CSV UTF-8与BOM不工作

东郭远航
2023-03-14

我已经被困在导出UTF-8 CSV与Windows Excel上显示乱码文本的汉字好几天了。我使用PHP,已经添加了BOM字节标记,并尝试编码,但没有运气。

它们在记事本、谷歌电子表格甚至Mac数字上都能很好地打开。但不是在客户要求的Excel上。使用记事本打开时,编码显示为UTF-8。如果我手动将其更改为UTF-8并保存,该文件将在Excel上正常打开。

似乎BOM字节标记不会保存在输出中,因为记事本总是将其检测为不带BOM的UTF-8。

此外,CSV不会保存在服务器上。数据从数据库中检索,然后直接导出。

这是我的密码:

// Setup headers
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-disposition: filename=".$filename.".csv");
header("Pragma: no-cache");

// First Method
$fp = fopen('php://output', 'w');
// Add BOM to fix UTF-8 in Excel, but doesn't work
fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF) );

if ($fp) {

    fputcsv($fp, array("Header"), ",");
    fputcsv($fp, array($string_with_chinese_chars), ",");
}

fclose($fp);
exit();

// Second Method
$csv = "";
$sep = ",";
$newline = "\n"; // Also tried with PHP_EOL

$csv .= "Header";
$csv .= $newline;
$csv .= $string_with_chinese_chars;
$csv .= $newline;

// Tried all the below ways but doesn't work.
// Method 2.1
print chr(255) . chr(254) . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');

// Method 2.2
print chr(239) . chr(187) . chr(191) . $csv;

// Method 2.3
print chr(0xEF).chr(0xBB).chr(0xBF);
print $newline;
print $csv;

共有3个答案

李景天
2023-03-14

我通常是这样做的:

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="filename.csv"');
header('Cache-Control: max-age=0');

// BOM header UTF-8
echo "\xEF\xBB\xBF";

$fh = @fopen('php://output', 'w');

...

我用的是“;” 作为excel的分隔符大多数情况下不会自动格式化,“

刘京
2023-03-14

下面的代码为我工作。在csv内容之前输出utf-8-bom字符:

  echo "\xEF\xBB\xBF"; // utf-8 bom 
  echo $csv;
申屠俊发
2023-03-14

根据您上面的评论,您的脚本似乎意外地在UTF-8 BOM之前打印出了一个换行符(hex0A),导致Excel无法将输出识别为UTF-8。

由于您使用的是PHP,请确保

实际上,这可能很难做到,因为许多文本编辑器坚持总是在最后一行的末尾追加换行符。因此,最安全、最简单的解决方案是省去

 类似资料:
  • 问题内容: 在Java错误数据库的页面http://bugs.sun.com/view_bug.do?bug_id=4508058上,它显示Sun / Oracle不会解决Java无法解析UTF-8编码字符串的BOM的问题。由于此页面上的最新评论可以追溯到2010年,所以我想知道是否有关于此的更年轻的信息?Java是否不能处理UTF-8的BOM表是否仍然正确? 问题答案: 是的,Java仍无法处理

  • 问题内容: 我在写一些注释过的PHP类,但偶然发现了一个问题。我的名字(用于@author标记)以一个(以UTF-8字符开头,…和一个奇怪的名字,我知道)结尾。 即使我将文件另存为UTF-8,也有一些朋友报告说他们看到这个字符完全弄乱了()。通过添加BOM表签名可以解决此问题。但是那件事让我有些烦恼,因为除了我在Wikipedia上以及关于SO的其他一些类似问题上所了解的之外,我对此并不了解。 我

  • 想要导出你的作品,可以在菜单中选择“文件 > 导出(File > Export)” ,或者点击工具条上的“导出(Export)”按钮。Sketch 的画布是无限大的,这也就意味着想导出图片的时候,需要先告诉 Sketch ,你感兴趣的是哪部分。

  • 我尝试用JasperReport导出CSV文件,问题是当我想打印像“€”这样的货币时。 当我搜索解决方案时,我意识到这是关于文件编码的!我写这个代码! JasperReport导出的文件编码在“没有BOM的UTF-8”上。所以当我用Excel打开文件时,“€”看起来像“,”。但是当我用记事本打开文件时,“€”看起来像“€”。 在记事本上,我将文件编码转换为UTF-8(我认为是BOM),我保存文件。

  • 没有一行式解决方案。小心、注意细节,以及一致性。 PHP 中的 UTF-8 糟透了。原谅我的用词。 目前 PHP 在低层次上还不支持 Unicode。有几种方式可以确保 UTF-8 字符串能够被正确处理, 但并不容易,需要深入到 web 应用的所有层面,从 HTML,到 SQL,到 PHP。我们旨在提供一个简洁、 实用的概述。 PHP 层面的 UTF-8 基本的字符串操作,如串接 两个字符串、将字

  • 8.日志导出 一、日志导出 为了方便您分析数据,及策支持按照激活、注册、登录以及5个自定义事件导出原始日志。 举例来说,您前段时间通过某渠道进行了一波投放,想了解该渠道所有激活的设备id等信息,可以在此新建导出日志,导出数据以了解详情。 Ps:只有创建者拥有日志导出权限 二、功能介绍 总记录数:该条日志的总条数,(状态为:已完成,显示总条数) 状态:计算中、已完成 2种状态 操作: 下载:任务计算