解決PHP匯出CSV檔案中文亂碼問題

2022-07-10 19:12:14 字數 1358 閱讀 5589

英文名: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-endianlittle-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 在寫入資料...