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

相关文章

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言