php 多语言(UTF-8编码)导出Excel、CSV乱码解决办法之导出UTF-8编码的Excel、CSV

转自:  https://www.cnblogs.com/kclteam/p/5278926.html

新项目,大概情况是这样的:可能存在多国、不同语种使用者,比喻有中文、繁体中文,韩文、日本等等,开发时选择了UTF-8编码,开发顺利,没有问题。昨天做了一个csv导出功能,导出的东西完全乱了:

设置mb_convert_encoding($content,"gb2312","UTF-8")的时候中文正常

设置mb_convert_encoding($content,"shift-jis","UTF-8")的时候日文正常

设置mb_convert_encoding($content,"UTF-8","UTF-8")的时候,都不正常

google了一下原因,我理解的大概意思是微软的csv等不支持uft-8编码,而是支持UTF-16LE编码,故做以下设置

1 //输出BOM
2 echo(chr(255).chr(254));
3 echo(mb_convert_encoding($content,"UTF-16LE","UTF-8"));

各种语言正常显示

以下是完整function,支持双字节文件名(比如日文或中文文件名)不乱码

 1 <?php
 2 /**
 3  *导出到CSV文件
 4  * @param $data   导出数组
 5  * @param $file_name 文件名
 6  */
 7 function export_csv($data,$file_name=‘‘)
 8 {
 9
10     $file_name = $file_name.‘_‘.date(‘YmdHi‘).‘.csv‘;
11     $encoded_filename  = urlencode($file_name);
12         $encoded_filename  = str_replace("+","%20",$encoded_filename );
13     $content = array_to_string($data);
14     header(‘Cache-control: private‘);
15     //判断浏览器,输出双字节文件名不乱码
16     $ua = $_SERVER["HTTP_USER_AGENT"];
17     if (preg_match("/MSIE/", $ua)) {
18         header(‘Content-Disposition: attachment; filename="‘ . $encoded_filename . ‘"‘);
19     }
20     else if (preg_match("/Firefox/", $ua)) {
21         header(‘Content-Disposition: attachment; filename*="utf8\‘\‘‘ . $file_name . ‘"‘);
22     }
23     else {
24         header(‘Content-Disposition: attachment; filename="‘ . $file_name . ‘"‘);
25     }
26     if(function_exists(‘mb_convert_encoding‘)){
27         header(‘Content-type: text/csv; charset=UTF-16LE‘);
28         //输出BOM
29         echo(chr(255).chr(254));
30         echo(mb_convert_encoding($content,"UTF-16LE","UTF-8"));
31         exit;
32     }
33 }
34 /**
35  *导出数据转换
36  * @param $result
37  */
38 function array_to_string($result)
39 {
40     if(empty($result)){
41         return i("没有符合您要求的数据!^_^");
42     }
43     $size_result = count($result);
44     for($i = 0 ; $i < $size_result ;  $i++) {
45         $data .= $result[$i]."\n";
46     }
47     return $data;
48 }
49 ?>

原文地址:https://www.cnblogs.com/taozi32/p/8677486.html

时间: 2024-10-01 01:28:43

php 多语言(UTF-8编码)导出Excel、CSV乱码解决办法之导出UTF-8编码的Excel、CSV的相关文章

asp.net 导出excel 中文乱码解决方法 (转)

用我转载的上一篇文章 Asp.net中把DataTable或DataGrid导出为Excel 导出的文档,中文有乱码现象,其实要解决中文乱码很简单,设置一下字符集.如下: // 设置编码和附件格式 curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312&

[转]mysql导入导出数据中文乱码解决方法小结

本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 代码如下: mys

SqlBulkCopy excel 字段映射解决办法二 使用数字索引代替 字段名称 做映射 避免字段中有中文 大小写等情况

多线程的SqlBulkCopy批量导入.事务和SqlBulkCopy使用的数据集中自定义映射字段的注意事项 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

golang导出csv乱码解决方法

golang导出csv乱码解决方法: 在csv文件的开头写入 UTF-8 BOM // 创建文件 dstf, err := os.Create(``"./data/" + fileName) defer dstf.Close() if err != nil { beego.Error(``"create file error: " + err.Error()) return ""``, err } `dstf.WriteString(``&quo

java中文乱码解决之道(三)—–编码详情:伟大的创想—Unicode编码

原文出处:http://cmsblogs.com/?p=1458 随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题,伟大的创想Unicode编码应时而生!! Unicode Unicode又称为统一码.万国码.单一码,它是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言.跨平台进行文本

java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码

随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题,伟大的创想Unicode编码应时而生!! Unicode Unicode又称为统一码.万国码.单一码,它是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言.跨平台进行文本转换.处理的要求.可以想象Unicode作为一个"字符大容器&qu

mysql导入导出数据中文乱码解决方法小结

inux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 复制代码 代码如下: mysqldump -uroot -p --default-character-set=utf8 dbname tablename > bak.sql 那么导入数据的时候也要使用--

phpexcel导出文件后,wps能用 excel打开乱码解决

导出excel后wps能用 excel打开乱码,是因为导出的类使用方式问题 把$objWriter = new \PHPExcel_Writer_Excel2007($this->_obj); 换成$objWriter = \PHPExcel_IOFactory::createWriter($this->_obj, 'Excel5');  就能解决问题 public function output($file_name){ //直接输出到浏览器 header("Pragma: pub

Python print报ascii编码异常的靠谱解决办法

之前遇到此异常UnicodeEncodeError: 'ascii' codec can't encode characters...,都是用这种方式解决:sys.setdefaultencoding('utf-8') 今天看到如下文章,阐述了此方式的弊端: http://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes 但此文章只考虑了未使用第三方库的情况下的解决办法,而第三方库里如果也有print的话,就束手无策了,总不能