PHP 生成 csv 檔案時亂碼解決

2021-06-08 04:50:03 字數 1565 閱讀 3220

什麼是csv檔案?comma separator value(逗號分隔值)是也。常常用來資料轉換的中間檔案存在,比如:從mysql中匯出資料到csv,匯入csv到sqlserver中。最近在用epsilon的郵件服務做郵件營銷,epsilon的web前端接受csv格式的郵件列表,於是乎在linux下用php指令碼從mysql資料庫中將user表的資料按照條件匯出成csv,以便匯入到epsilon的web前端發郵件,問題出現了,使用utf-8編碼匯出csv檔案,開啟後裡邊的中文成了亂碼(windows下csv檔案預設與microsoft excel關聯),用notepad++或者word開啟正常,不過排版很亂,看著累呀。

什麼是bom?byte order mark(位元序標記)是也。

為了識別 unicode 檔案,microsoft 建議所有的 unicode 檔案應該以 zero width nobreak space字元開頭。這作為乙個"特徵符"或"位元組順序標記(byte-order mark,bom)"來識別檔案中使用的編碼和位元組順序(big-endian或little-endian),具體的對應關係見下表。

bytesencoding form00 00 fe ffutf-32, big-endianff fe 00 00utf-32, little-endianfe ffutf-16, big-endianff feutf-16, little-endianef bb bfutf-8

類unix系統中並沒有使用 bom,因為它會破壞現有的 ascii 檔案的語法約定。

我的php原始碼檔案是用notepad++生成的,在centos下執行,格式為:以utf-8無bom格式編碼,因此要想匯出microsoft excel可以正常顯示的utf-8的csv檔案,需要顯式的輸出bom(ef bb bf,上表的最後一種型別),然後再輸出mysql中的有效資料。編寫如下函式:

<?php

/*** @param $file_name string 要匯出的檔名,比如:mail-list.csv

* @param $content string 要輸出的csv格式的資料,用逗號分隔各欄位

* @return null

*/function output_csv($file_name,$content)

header( "cache-control: public" );

header( "pragma: public" );

header( "content-type: text/csv" ) ;

header( "content-dis; filename=" ) ;

header( "content-length: ". strlen( $content ) );

echo $content;

exit; 

}?>

問題解決。

ps1:output_csv函式使用前,確保php原始碼是utf-8,並且無bom,並且沒有輸出任何內容。

ps2:bom實際上挺煩人,如果你的網頁(*.html)有bom,在ie6.x下面開啟會發現一神奇的空行,firefox下卻沒有,遇到過沒?

ps3:參考文章utf-8,utf-16,utf-32,bom

ref:

PHP寫入生成csv或txt檔案亂碼解決方案

相信很多人在使用php的過程中都遇到過生成檔案亂碼的情況,不論是使用fwrite還是file put contents寫入。可能你會先嘗試從編碼入手嘗試解決,但最終的結果往往是不理想的,儘管我們都將其轉換為了utf 8編碼了.那麼究其根本原因是什麼呢?一句話 缺少頭部bom 當然,這裡指的肯定不是j...

php 生成讀取csv檔案並解決中文亂碼

csv其實是文字檔案,但是裡面的內容是利用逗號分隔的。1.生成csv檔案 1 function new csv arr 2 1011 string implode value n 用英文逗號分開12 13 filename date ymd csv 設定檔名 14header content typ...

解決PHP 輸出csv檔案中文亂碼

header content type text csv charset gb2312 header content disposition filename 開啟郵件匯出 date ymdhis csv echo 收件人郵箱,收件人姓名,傳送時間 r ob end flush foreach li...