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和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio