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如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

《Java下载文件中文文件名乱码的解决方案(文件名包含很多%)》Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath,UTF-8... 目录Java下载文件中文文件名乱码问题一般情况下,大家都是这样为了解决这个问题最终解决总结Java下

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

在 Windows 上安装 DeepSeek 的完整指南(最新推荐)

《在Windows上安装DeepSeek的完整指南(最新推荐)》在Windows上安装DeepSeek的完整指南,包括下载和安装Ollama、下载DeepSeekRXNUMX模型、运行Deep... 目录在www.chinasem.cn Windows 上安装 DeepSeek 的完整指南步骤 1:下载并安装

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,