首頁  >  文章  >  後端開發  >  php 生成csv ma​​c下亂碼

php 生成csv ma​​c下亂碼

不言
不言原創
2018-04-24 09:20:001898瀏覽

這篇文章主要介紹了php 生成csv ma​​c下亂碼,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下


<?php
     $file_name = date(&#39;Ymd&#39;, time()) . &#39;.csv&#39;;  //设置文件名
     header(&#39;Content-Type: application/vnd.ms-excel&#39;);
header(&#39;Content-Disposition: attachment;filename=&#39;.$file_name);
header(&#39;Cache-Control: max-age=0&#39;);
$fp = fopen(&#39;php://output&#39;, &#39;a&#39;);
$row = [
&#39;name&#39; => &#39;测试&#39;,
&#39;email&#39; => 111111,
&#39;mobile&#39; => 22222,
&#39;weixinid&#39; => &#39;微信号&#39;,
];
fwrite($fp,"\xEF\xBB\xBF");
fputcsv($fp, $row);


php匯出csv檔案亂碼問題解決方法







##說這個問題之前先來說一下什麼是CSV檔? Comma Separator Value(逗號分隔值)是也。常用來資料轉換的中間檔案存在,例如:從Mysql匯出資料到CSV,匯入CSV到SqlServer中。在Linux下用PHP腳本從Mysql資料庫中將表的資料依照條件匯出成csv,使用utf-8編碼匯出CSV文件,開啟後裡邊的中文成了亂碼(Windows下CSV文件預設與Microsoft Excel關聯),用Notepad 或Word打開正常,但排版很亂。原因:BOM惹的禍,微軟惹的禍。

什麼是BOM? Byte Order Mark(比特序標記)是也。  Bytes Encoding Form00 00 FE FF#UTF-32, big-endianFF FE 00 00UTF-32, little-endianFE FFUTF-16, big-endianFF FE
為 了識別 Unicode 文件,Microsoft 建議所有的 Unicode 文件應該以 ZERO WIDTH NOBREAK SPACE字元開頭。這作為一個”特徵符”或”字節順序標記(byte-order mark,BOM)”來識別文件中使用的編碼和字節順序(big-endian或little-endian),具體的對應關係見下表。  

UTF-16, little-endian


EF BB BF

UTF-8

 
類別Unix系統中並沒有使用BOM,因為它會破壞現有的ASCII 檔案的語法約定。


實作程式碼如果


註:在寫csv檔時確保php原始碼是utf-8,且無BOM,且沒有輸出任何內容。

#Excel在讀取csv的時候是透過讀取檔案頭上的bom來識別編碼的,如果檔案頭無bom訊息,則預設按照unicode編碼讀取。 (這個bom是微軟自己定義的一種文件頭部協定,顧名思義存儲在文件頭部,存儲內容就是標識文件編碼的信息。)

#而我們生成csv的平台不一定遵循微軟的bom協議,導致如果輸出非unicode編碼的csv檔(例如utf-8),並且沒有產生bom訊息的話,Excel自動按照unicode編碼讀取,就會出現亂碼問題了。

掌握了這點相信亂碼已經無法阻擋我們前進的步伐了:只需將非unicode編碼的csv文件,用文本編輯器(推薦notepad )打開並轉換為帶bom的編碼形式(具體編碼方式隨意),問題解決。


相關推薦:

######PHP產生唯一RequestID類別#############實例詳解php產生.csv後綴檔案表格的方法##### ###########

以上是php 生成csv ma​​c下亂碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn