英文名:comma separator value
(逗號分隔值),常用來資料轉換的中間檔案存在,比如:從mysql
中匯出資料到csv中。
在web系統中經常遇到要匯出報表資料,也會用到csv格式,使用utf-8
編碼匯出csv檔案,開啟後裡邊的中文成了亂碼 (windows下csv檔案預設與microsoft excel
關聯),用文字編輯器開啟正常,不過排版很亂。
原因:缺少bom,又是微軟畫蛇添足。
byte order mark
(位元序標記),微軟定義的一種頭部結構。
為了識別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
類unix系統中並沒有使用 bom,因為它會破壞現有的 ascii 檔案的語法約定
我們在使用php匯出csv檔案時, 如果只使用file_put_contents
或者fwrite
寫入了**資料, 而我們生成csv的平台不一定遵循微軟的bom協議,導致如果輸出非unicode編碼的csv檔案(例如utf-8),並且沒有生成bom資訊的話,excel自動按照unicode編碼讀取,就會出現亂碼問題了。
而沒有寫入bom頭資訊,就會出現開啟中文亂碼的情況。
excel在讀取csv的時候是通過讀取檔案頭上的bom來識別編碼的,如果檔案頭無bom資訊,則預設按照unicode
編碼讀取。
如果想使用utf-8格式,確保php原始碼是utf-8,我們可以在第一行寫入utf-8對應的bom資訊
**如下:
$bom = pack('ccc', 0xef, 0xbb, 0xbf); // 和上面的對應
參考鏈結
PHP匯出CSV檔案
經常會碰到需要從資料庫中匯出資料到excel檔案,用一些開源的類庫,比如phpexcel,確實比較容易實現,但對大量資料的支援很不好,很容易到達php記憶體使用上限。這裡的方法是利用fputcsv寫csv檔案的方法,直接向瀏覽器輸出excel檔案。輸出excel檔案頭,可把user.csv換成你要的...
解決PHP 輸出csv檔案中文亂碼
header content type text csv charset gb2312 header content disposition filename 開啟郵件匯出 date ymdhis csv echo 收件人郵箱,收件人姓名,傳送時間 r ob end flush foreach li...
PHP 匯出csv檔案亂碼解決方案
我們經常匯出csv檔案都喜歡直接用file put contents file name file 這種方式直接匯出,如果沒有中文字元還好,要是有中文字元的話就會出現亂碼的情況,讓人很是頭疼,下面是亂碼解決方案 str 匯出的含有中文字元的內容 fp fopen export.csv a 在寫入資料...