`

解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题

 
阅读更多
写道
其实这个问题很久之前遇到过, 应该是没解决, 当时的情况是openoffice打开正常而excel打开不正常, 后来也没解决了, 只能把编码转了.

这次又遇到这个问题了, 在网上一番寻找, 在一篇java的文章里找到了原因, 是由于输出的CSV文件中没有BOM.

什么是BOM?

在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。

那么如何在PHP中输出BOM呢?

在所有内容输出之前

print(chr(0xEF).chr(0xBB).chr(0xBF));
 
<?php

function writeCsvToFile($file,array $data){
	$fp = fopen($file, 'w');
	
	//Windows下使用BOM来标记文本文件的编码方式
	fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF));
	
	foreach ($data as $line) {
		fputcsv($fp, $line);
	}
	
	fclose($fp);
}

$file = "./testcsv.csv";
$data = array(
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
);

writeCsvToFile($file,$data);
 
分享到:
评论

相关推荐

    php导出csv文件无乱码示例

    // 假设$data是从数据库或其他来源获取的UTF-8编码的数据 $data = [ ['字段1', '字段2', '字段3'], // ... ]; // 使用fputcsv写入数据 foreach ($data as $row) { fputcsv($handle, $row); } // 关闭文件句柄 ...

    基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)

    在这个场景下,可以将utf-8编码的文件名或数据转换为gb2312编码,从而解决旧版Office软件的兼容性问题。 8. 使用`fopen`函数操作文件: - `fopen`函数用于打开文件,如果文件不存在则创建它。结合`fopen`和`fwrite...

    完美解决php 导出excle的.csv格式的数据时乱码问题

    确保用户的Excel软件设置为正确的编码来打开CSV文件,特别是对于非UTF-8编码的文件。 6. **使用库或工具**: 有一些PHP库,如`PHPExcel`或`fputcsv()`函数,可以简化CSV文件的生成,同时处理编码问题。使用这些...

    php导入csv文件碰到乱码问题的解决方法

    在这个场景下,我们可以将CSV文件中的GBK编码转换为UTF-8编码。示例代码如下: ```php $str = mb_convert_encoding($str, "UTF-8", "GBK"); ``` 2. **iconv()**: `iconv()`函数也具有类似功能,可以进行编码...

    php生成excel几种方式_实例

    例如,可以使用`iconv()`或`mb_convert_encoding()`函数将字符串从一种编码转换为UTF-8,以保证与Excel的兼容性。在写入数据时,也可以设定字符集以避免乱码。 对于版本不一致的问题,选择支持多种Excel版本的库如...

    PHP导出excel表格

    确保你的PHP文件和Excel文件都使用相同的编码,如UTF-8。在保存文件时,可以设置编码: ```php header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-...

    原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】

    使用`iconv()`函数将文件名从UTF-8编码转为GBK编码,确保在非Unicode环境中正确显示。 3. **设置HTTP响应头**: - `Content-Type: application/vnd.ms-excel`:声明文件类型为Excel。 - `Content-Disposition: ...

    php 下载数据到excel表格 及编码问题

    在PHP中下载数据到Excel表格是一项常见的任务...总的来说,下载数据到Excel表格涉及PHP脚本处理数据、创建Excel文件格式以及处理编码问题。使用正确的库和编码方法,可以避免数据丢失或乱码,实现顺畅的数据导出体验。

    golang与PHP输出excel示例

    在Go语言的示例中,首先使用os包的Create函数创建了一个文件,随后在文件开头写入了UTF-8的字节顺序标记(BOM),这一步骤用于确保Excel能够正确地识别UTF-8编码,避免乱码问题。 ```go package main import ( "os...

    基于PHP导出Excel的小经验 完美解决乱码问题

    这样的HTML表格会被Excel识别为工作表,同时由于HTML文档已经指定了UTF-8编码,所以中文字符可以正确显示,不再需要`iconv`转换。 总结来说,解决PHP导出Excel文件中文乱码问题的关键在于确保文件的编码与Excel的...

    php 导出excel

    在处理中文乱码时,可以考虑将字符串从UTF-8编码转换为GBK,例如使用`mb_convert_encoding`函数。 总之,选择哪种方法取决于项目需求,如数据的复杂性、文件大小、格式要求以及服务器环境。对于小型项目或简单数据...

    php导入excel

    如果遇到中文乱码问题,可以尝试将字符串从UTF-8编码转换为GB2312。 PHPExcel是广泛使用的PHP库,用于读取、写入和创建Excel文件,它支持多种文件格式,包括Excel 2003的.XLS和Excel 2007及更高版本的.XLSX。以下是...

    flex air 导出 excel

    使用Apache POI库时,设置正确的字符编码(如UTF-8),确保Excel文件能够正确显示中文。 尽管这种方法可以解决Flex Air导出含中文Excel的问题,但会增加服务器端的复杂性。另外,如果数据量大,频繁的服务器交互...

    完美解决phpexcel导出到xls文件出现乱码的问题

    解决乱码问题的关键在于确保文件的编码设置正确,通常在 Excel 2003 以下版本的文件中会使用 GBK 编码,而对于 Excel 2007+ 格式的文件则使用 UTF-8 编码。在使用 PHPExcel 导出文件时,必须确保编码一致且正确,...

    php中使用PHPExcel读写excel(xls)文件的方法

    特别注意,在写入xls文件时,数据和标题应该以UTF-8编码格式存储,以避免中文乱码问题。 4. PHPExcel中单元格样式的设置: PHPExcel允许用户自定义单元格的样式。这包括字体样式、对齐方式、边框样式以及单元格...

    PHP导出MySQL数据到Excel文件(fputcsv)

    接着,我们输出Excel列名,并使用`iconv`函数将UTF-8编码转换为GBK,因为Excel通常使用GBK编码来避免中文乱码。 ```php $fp = fopen('php://output', 'a'); $head = ['姓名', '性别', '年龄', 'Email', '电话', '.....

    PHP导入Excel到MySQL的方法

    4. 测试环境说明:在测试环境中,使用的MySQL数据库采用的是utf8编码。导入的Excel文件可以是.xls格式(旧版Excel)或.xlsx格式(Excel 2007及以上版本)。 5. PHP代码示例:文件中提供了一个名为test.php的PHP脚本...

Global site tag (gtag.js) - Google Analytics