注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

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

2014-09-28 19:29:41|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
来源:http://www.dewen.io/q/1708/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3PHP%E7%94%9F%E6%88%90UTF-8%E7%BC%96%E7%A0%81%E7%9A%84CSV%E6%96%87%E4%BB%B6%E7%94%A8Excel%E6%89%93%E5%BC%80%E4%B9%B1%E7%A0%81%E7%9A%84%E9%97%AE%E9%A2%98

在你要输出的内容前先输出"\xEF\xBB\xBF",例如:你要输出的内容保存在$content里
$content = "\xEF\xBB\xBF".$content; //添加BOM
确保输出$content前没有任何其他东西输出。
何为BOM,它是Windows用来标记文本文件的编码方式的,你可以在网上查查相关BOM资料。

  1. <?php
  2. function writeCsvToFile($file,array $data){
  3.     $fp = fopen($file, 'w');
  4.    
  5.     //Windows下使用BOM来标记文本文件的编码方式
  6.     fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF));
  7.    
  8.     foreach ($data as $line) {
  9.         fputcsv($fp, $line);
  10.     }
  11.    
  12.     fclose($fp);
  13. }

  14. $file = "./testcsv.csv";
  15. $data = array(
  16.     array(1,'色色',12345,'vb200'),
  17.     array(1,'色色',12345,'vb200'),
  18.     array(1,'色色',12345,'vb200'),
  19.     array(1,'色色',12345,'vb200'),
  20.     array(1,'色色',12345,'vb200'),
  21.     array(1,'色色',12345,'vb200'),
  22.     array(1,'色色',12345,'vb200'),
  23.     array(1,'色色',12345,'vb200'),
  24.     array(1,'色色',12345,'vb200'),
  25.     array(1,'色色',12345,'vb200'),
  26.     array(1,'色色',12345,'vb200'),
  27.     array(1,'色色',12345,'vb200'),
  28.     array(1,'色色',12345,'vb200'),
  29.     array(1,'色色',12345,'vb200'),
  30.     array(1,'色色',12345,'vb200'),
  31.     array(1,'色色',12345,'vb200'),
  32.     array(1,'色色',12345,'vb200'),
  33. );

  34. writeCsvToFile($file,$data);

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

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

以UTF-8无BOM格式编码,因此要想导出Microsoft Excel可以正常显示的UTF-8的CSV文件,需要显式的输出BOM(EF BB BF,上表的最后一种类型),然后再输出Mysql中的有效数据。编写如下函数:

  1. function output_csv($file_name,$content)
  2. {
  3. $content = "/xEF/xBB/xBF".$content; //添加BOM
  4. if( empty( $file_name ) )
  5. {
  6. $file_name = date("Ymd")."csv";
  7. }
  8. header( "Cache-Control: public" );
  9. header( "Pragma: public" );
  10. header( "Content-type: text/csv" ) ;
  11. header( "Content-Disposition: attchment; filename={$file_name}" ) ;
  12. header( "Content-Length: ". strlen( $content ) );
  13. echo $content;
  14. exit;
  15. }







输出前要标明编码格式,只要编码统一了就肯定没问题

  1. $filename = $iconv->convert('UTF8', 'GB2312', $filename );
  2. header("Content-type: application/vnd.ms-excel; charset=GB2312");
  3. header("Content-Disposition: attachment; filename=$filename.xls");
评论 (0) ? 链接 ? 2012-02-21
  1. $str = iconv('utf-8','gb2312',$str);

指定文件编码后,转换数据内容编码

  评论这张
 
阅读(376)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017