这篇文章主要介绍了 PHP 下载文件时自动添加 bom 头的方法实例, 有需要的朋友可以参考一下
首先弄清楚, 什么是 bom 头? 在 Windows 下用记事本之类的程序将文本文件保存为 UTF-8 格式时, 记事本会在文件头前面加上几个不可见的字符(EF BB BF), 就是所谓的 BOM(Byte order Mark)
不仅限于 记事本保存的文件, 只要在文件的开口包含了 EF BB BF 几个不可见的字符 (十六进制应该是是 xEFxBBxBF, 用二进制编辑文件可见) 这像是一个约定俗成的东西, 当系统看到这玩意的时候, 就会觉得你这个文件是 UTF-8 编码的
如果你的接口是 UTF-8 的, 你需要强制下载一个文件, 比如 csv.excel 在默认情况 (中文背景) 下, 认为 csv 是 GB 编码的, 所以如果米有 bom 头, 那你给用户呈现的文件, 可能就是乱码了
怎么加 bom 头呢?
在输出文件之前加上 bom 头就可以了:
代码如下:
- // 文件名
- $filename = "www.jb51.net.net.csv";
- header('Expires:' . gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + 10) . 'GMT');
- header('Cache-Control: max-age=10');
- //header('Content-Type: application/vnd.ms-excel; charset=utf-8');
- header('Content-Type: text/csv; charset=utf-8');
- header("Content-Disposition: attachment; filename={$filename}");
- // 如果结果中有提示信息, 则把第一行输出改为提示信息文字
- $out = "xEFxBBxBF";// 加上 bom 头, 系统自动默认为 UTF-8 编码
- if (!empty($extra['notice'])) {
- $out .= "{$extra['notice']}rn";
- }
- // 输出
- foreach ($table as $row) {
- $out .= implode(",", $row) . "rn";
- }
- /* if (mb_detect_encoding()($out) == 'UTF-8') {
- $out = iconv("UTF-8//IGNORE", "GBK", $out);
- } */
- echo $out;
来源: https://www.php1.cn/detail/php-bc0a25caec.html