解决PHP导出CSV文件中文乱码问题

news/2024/6/17 8:18:28

什么是CSV文件?

英文名:Comma Separator Value(逗号分隔值),常用来数据转换的中间文件存在,比如:从Mysql中导出数据到CSV中。在web系统中经常遇到要导出报表数据,也会用到csv格式,使用utf-8编码导出CSV文件,打开后里边的中文成了乱码 (Windows下CSV文件默认与Microsoft Excel关联),用文本编辑器打开正常,不过排版很乱。原因:缺少BOM,又是微软画蛇添足。

什么是BOM?

Byte Order Mark(比特序标记),微软定义的一种头部结构。

为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符开头。这作为一个”特征符”或”字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序(big-endianlittle-endian),具体的对应关系见下表。

1

2

3

4

5

6

Bytes Encoding      Form

00 00 FE FF         UTF-32, big-endian

FF FE 00 00         UTF-32, little-endian

FE FF               UTF-16, big-endian

FF FE               UTF-16, little-endian

EF BB BF            UTF-8

类Unix系统中并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

我们在使用PHP导出csv文件时, 如果只使用file_put_contents 或者 fwrite 写入了表格数据, 而我们生成csv的平台不一定遵循微软的bom协议,导致如果输出非unicode编码的csv文件(例如utf-8),并且没有生成bom信息的话,Excel自动按照unicode编码读取,就会出现乱码问题了。而没有写入BOM头信息,就会出现打开中文乱码的情况。

PHP中文乱码解决

Excel在读取csv的时候是通过读取文件头上的bom来识别编码的,如果文件头无bom信息,则默认按照unicode编码读取。

如果想使用utf-8格式,确保php源码是utf-8,我们可以在第一行写入utf-8对应的BOM信息

代码如下:

1

2

3

$bom = pack('CCC', 0xef, 0xbb, 0xbf); // 和上面的对应

file_put_contents('pythontab.csv',$bom, FILE_APPEND);

file_put_contents('pythontab.csv',$someData, FILE_APPEND); //写入你想要写入表格的数据

前后都省略了部分代码, 只写了最关键的部分, 其它部分大家自行补充即可。

这样生成的csv就不会出现中文乱码问题啦。

注意:写入的BOM头信息要和文件的编码对应。


http://www.niftyadmin.cn/n/310493.html

相关文章

YOLO入门指南:理解YOLO原理及构建第一个目标检测模型

YOLO(You Only Look Once)是一种快速且准确的目标检测算法,可以在图像或视频中检测出多个对象的位置和类别。在本篇文章中,我们将介绍YOLO的基本原理,并使用TensorFlow构建第一个目标检测模型。 YOLO的基本原理 YOLO的…

每日一个小技巧:1分钟告诉你图片怎么转语音

随着科技的不断进步,人们对于信息的获取方式也越来越多样化。而在这些方式中,图片和文字无疑是比较常见的两种。图片以其生动直观的特点吸引了许多人的眼球,而文字则以其更为详尽的信息呈现方式成为了人们了解事物的首选。然而,对…

融云亮相「中国信息技术应用创新大会」,入选数字化转型优秀方案集

4 月 27 日,以“全栈创新 从可用到好用”为主题的“2023 第六届中国信息技术应用创新大会”在京顺利召开。移步【融云全球互联网通信云】回复“地图”限量免费领《社交泛娱乐出海作战地图》 大会以“论坛展示展览”的方式,全面、深入地反映信创产业的最新…

前端的培训计划书

文章目录 导文模板一一、前言二、培训目标三、培训内容和计划 模板二模板三 导文 这里是导文 模板一 一、前言 随着互联网的快速发展,前端开发已经成为了现代软件开发中一个不可或缺的重要技能。本次培训旨在帮助学员快速掌握前端开发的核心知识和技能&#xff0c…

PlSql存储过程基础

目录儿 常用指令1. 什么是PLSQL语言2. PLSQL程序结构2.1 第一个程序 HelloWord:2.2 执行程序2.2.1 在工具中执行2.2.2 在sqlplus客户端中执行(命令行) 3. 变量3.1 普通变量3.2 引用型变量3.3 记录型变量 4. 流程控制4.1 条件分支4.2 循环 5. 游标5.1 定义5.2 语法5.3 游标的属性…

docker 系列之 Dockerfile 文件里 cmd命令与entrypoint命令区别

文章目录 一、cmd:用法1:带有中括号的形式用法2:shell form,即没有中括号的形式 二、entrypoint:第一种:命令行模式,也就是带中括号第二种:shell模式 三、总结: 一、cmd&…

android横屏

最近负责了项目中平板适配工作,总结了一些相关方法记录下来 方法介绍 1、判断是否是平板设备 官方给出的方法如下 public static boolean isTabletDevice(Context context) {return (context.getResources().getConfiguration().screenLayout & Configuratio…

CnOpenData缺陷产品召回数据

一、数据简介 缺陷产品召回,是指缺陷产品的生产商、销售商、进口商在得知其生产、销售或进口的产品存在可能引发消费者健康、安全问题的缺陷时,依法向职能部门报告,及时通知消费者,设法从市场上、消费者手中收回缺陷产品&#xff…