PHP 的 laravel 导出 csv 时,在 Windows 的 Micr Office 中出现乱码解决办法总结

2023-11-21 05:20

本文主要是介绍PHP 的 laravel 导出 csv 时,在 Windows 的 Micr Office 中出现乱码解决办法总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

一次使用 laravel 的 Excel Facades 时,测试同事发现在他的 Windows Micro Office Excel 中打开是乱码的 ,这是故事的开始。

下面是我使用 Excel 的方法:

$exportArr = [['1']
];
$top = ['test'];
array_unshift($exportArr, $top);
$fileName = 'xx';Excel::create($fileName, function($excel) use ($exportArr)
{$excel->sheet('sheet', function($sheet) use ($exportArr){$sheet->rows($exportArr);});
})->export('csv');

现象:只有在 Windows 的 Micro Office Excel 中打开是乱码,其他端都是OK的,这就很奇怪。

但是,将文件的编码格式改为 UTF-8 BOM 后,再打开就没有乱码了。看来跟这个 BOM有关系了。


百度一番后,需要了解以下知识点:

  1. BOM (Byte Order Mark)也是 Unicode 标准的一部分,通常BOM是用来标示Unicode纯文本字节流,Windows 使用 BOM 来区分输入的文本是使用哪种 Unicode 编码的(UTF-8,UTF-16BE,UTF-16LE),所以,它会在文本的开头自动加上 BOM的标识。这段整理自 「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个? 来自 陈甫鸼 的回答。才会有网上说的这些问题: 
    1. 新建一个空的文本文档,却占用了 3 字节
    2. 一个特殊的空格ZERO WIDTH NO-BREAK SPACE
  2. 那么 BOM 在不同的编码格式中,输出到文件开头的字符是不一样的。对应关系可以参考 上面 2 [ 一个特殊的空格ZERO WIDTH NO-BREAK SPACE ] 的相关内容。为了方便查阅,盗图一下 
  3. BOM 在不同编码中的对应关系

  4.     UCS 编码中 有个字符 ZERO WIDTH NO-BREAK SPACE 意思就是 零宽度非换行空格。这个字符就是 BOM。在字节流中,用来标识字节流的顺序。具体可以百度了解一下,这里不详细说明。

了解了这些后,我们就知道需要将 输出的文本的格式切换为 UTF-8 BOM,这样 Windows 的 Office Excel 才能正常打开文本。

那么如果将 UTF-8 的编码格式转变为 UTF-8 BOM呢。下面是百度的结果,大家可以试试以下方法可以解决。

  1. laravel 导出csv文件 用excel打开中文乱码问题之BOM 这个主要是修改 laravel 第三方库的配置
  2. phpexcel导出excel中文乱码问题解决 这个主要是使用 PHP 的 ob_end_clean() 方法
  3. Laravel Excel 遇到的坑 这个是使用 iconv() 将输出的文本改变编码格式
  4. laravel-admin表格数据导出乱码问题解决 这个是利用 BOM 在 UTF-8 编码格式下输出文本的字符,来告诉 Windows 使用 UTF-8 BOM 编码
  5. 完美解决laravel-admin 导出excel文件中文乱码 这个跟 1 和 4 中的差不多,他也是修改源码,但是使用 BOM 在 UTF-8 编码格式下的字符,输出到文本的头部

但是这些方法都没有解决我使用上面的代码导出的文本在 Excel 中乱码的问题。但是,上面的几种方法,我尝试结合来一下,发现是可以解决的。看代码:


解法一:

Excel::create(iconv('UTF-8', 'GBK', $fileName), function($excel) use ($exportArr)
{print(chr(0xEF).chr(0xBB).chr(0xBF));$excel->sheet('sheet', function($sheet) use ($exportArr){$sheet->rows($exportArr);});
})->export('csv');

还有另外一种解决办法,请参考代码

解法二:

function setExportCSV($name, $type = 'csv')
{if (!$name)$name = "新建文件";if (preg_match('/Firefox/i', $_SERVER['HTTP_USER_AGENT'])) {$name = preg_replace("/ |\t|\"/", '', $name);header("Content-type:text/csv");header("Content-Disposition:attachment;filename=" . $name . "." . $type);header('Cache-Control:must-revalidate,post-check=0,pre-check=0');header('Expires:0');header('Pragma:public');} else if (preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT'])) {$name = preg_replace("/ |\t|\"/", '', $name);$name = urlencode($name);header("Content-type:application/octet-stream");header("Accept-Ranges:bytes");header("Content-type:application/vnd.ms-excel;charset=UTF-8");header("Content-Disposition:attachment;filename=" . $name . "." . $type);header('Content-Transfer-Encoding: binary');header("Pragma: no-cache");header("Expires: 0");} else {$name = preg_replace("/ |\t|\"/", '', $name) . '.' . $type;header("Content-type:application/octet-stream");header("Accept-Ranges:bytes");header("Content-type:application/vnd.ms-excel;charset=UTF-8");header("Content-Disposition:attachment;filename=" . urlencode($name));header('Content-Transfer-Encoding: binary');header("Pragma: no-cache");header("Expires: 0");}
}function exportCSV($exportData)
{foreach ($exportData as $key => $rt) {$a = implode('zqxddcghl', $rt);$b = str_replace(',', ',', $a);echo iconv('UTF-8', 'GBK//IGNORE', str_replace("\n", ' ', str_replace('"', '“', (str_replace('zqxddcghl', ',', $b)))) . "\n");}exit;
}

使用方法是:

setExportCSV($fileName);
exportCSV($exportArr);

到这里,这个问题已经解决了。如果文中,有什么出入的地方,还请不吝指教,谢谢。

对于第二种解决办法,等后面有时间了,再详细说明一下运行原理。

这篇关于PHP 的 laravel 导出 csv 时,在 Windows 的 Micr Office 中出现乱码解决办法总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400095

相关文章

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤