WeHelp
匯出CSV 亂碼問題處理的解法和注意事項
2024-09-18 15:38:19
**前言** === :::info 這篇文章簡單整理在處理匯出匯入 CSV 檔案遇到的一些小問題,和解決方案。 ::: **匯出後,Windows 系統打開出現亂碼** === 因為是在 MAC 開發測試,一開始沒有意識到這個問題,直到客戶詢問才發現。 ### 造成原因 1. Mac 和 Windows 系統對於 CSV 檔案的編碼默認設置不同,Mac 可能使用 UTF-8,而 Windows 上的 Excel 通常預設使用 ANSI 或其他編碼方式來讀取 CSV 檔案。 ### 解決方案 1. 要在匯出 CSV 檔案的 Header 加上 BOM(Byte Order Mark),這樣 Windows 上的 Excel 就能正確識別為 UTF-8 編碼。以下是簡單的範例: ``` php // output BOM fwrite($output, "\xEF\xBB\xBF"); ``` 2. 如果無法修改匯出邏輯,在 Windows 打開記事本 另存檔案時選擇 `UTF-8 BOM`。 ### 注意事項 1. 前後端一致性: - 問題:如果前端API輸出了正確的具有BOM的CSV,但前端在處理時未保留BOM,最終用戶下載的檔案仍然可能出現亂碼。 - 原因:有些前置庫在處理CSV資料時可能會自動刪除BOM。 - 解決方案:確保前端程式碼在處理CSV資料時保留BOM。 2. 匯入時要注意 `BOM` 的部分: 若是匯入後有要開頭就要讀取 CSV,要注意如果是 BOM 開頭要從文件開頭讀取 3 個字節,這是因為 UTF-8 的 BOM 是由三個字節 `\xEF\xBB\xBF` 組成的,簡單範例如下: ``` php $handle = fopen($path, 'r'); $bom = fread($handle, 3); if ($bom != "\xEF\xBB\xBF") { rewind($handle); } ```