# CSV/Excel 編碼2 匯出成csv中文亂碼/難字 ###### tags: `csv` ---- [[EXCEL] Excel打開是亂碼?快速找回資料的最好方法!](http://blog.e-happy.com.tw/excel-excel%E6%89%93%E9%96%8B%E6%98%AF%E4%BA%82%E7%A2%BC%EF%BC%9F%E5%BF%AB%E9%80%9F%E6%89%BE%E5%9B%9E%E8%B3%87%E6%96%99%E7%9A%84%E6%9C%80%E5%A5%BD%E6%96%B9%E6%B3%95%EF%BC%81/) [PHP big5轉utf8不要用iconv(),iconv這個函數,用mb_convert_encoding](https://vector.cool/php-big5%E8%BD%89utf8%E4%B8%8D%E8%A6%81%E7%94%A8iconv%EF%BC%8Ciconv%E9%80%99%E5%80%8B%E5%87%BD%E6%95%B8%EF%BC%8C%E6%98%AF%E5%BE%88%E4%B8%8D%E8%B2%A0%E8%B2%AC%E4%BB%BB%E7%9A%84%EF%BC%8C%E6%94%B9/) 這篇比較清楚建議讀這篇 [[PHP] iconv big5轉換utf8問題](https://sweslo17.blogspot.com/2012/04/big5-erpms-sql-local-cache-phpiconv.html) [解決匯出 CSV 的亂碼問題](https://snippetinfo.net/media/1947) 文章內所有技術版權皆不來自於我 --- PHP中有方便的內建函數 可以直接轉換編碼 常常遇到客戶需要將資料轉換成csv檔的事情中 有哪些需要注意呢? CSV 用 Excel開怎麼都看到亂碼該怎麼辦?? ## 目錄 - **使用程式消除亂碼** - **解決匯出 CSV 的亂碼問題** - **iconv big5轉換utf8問題** - **補充** - **無使用程式消除亂碼** --- ## 使用程式消除亂碼 根據第二篇說法 是轉換到一半會直接停止 但自己剛剛試了後出來的文件都是全白檔案 即使將難字後在後端也是整份文件為白色 可見我還不太會== 不過目前可以使用中文部亂碼就好 剩下的都之後再說 ### 解決匯出 CSV 的亂碼問題 透過 PHP 輸出 CSV 檔案時,常常發生一個狀況,就是如果這個檔案裏面有中文,直接用 excel 打開 CSV 會發現中文都是亂碼! 其實只要一個很簡單的方法,就是讓這個 CSV 檔案最前面有 BOM (Byte Order Mark),這樣用 Excel 開起來就不會有問題囉! 方法如下,輸出 \xEF\xBB\xBF 即可 (用於 UTF8) ```php $fp = fopen('file.csv', 'w'); // output BOM fwrite($fp, "\xEF\xBB\xBF"); fputcsv($fp, $data); fclose($fp); ``` ***BOM 在整份文件中只要輸出一次就好*** --- ### iconv big5轉換utf8問題 不要以為big5轉utf8就用iconv()這麼簡單 ```php= iconv("big5", "UTF-8", $str); ``` big5有很多字是沒有收錄的: > 綫、綉、滙、栢、峯、頴、邨、着、双 iconv這個函數他遇到轉不出來的字,就停住了,可能會造成輸出文件中斷,導致文件結構錯誤。 請改用 mb_convert_encoding ,別高興太早 big5 沒有的字依然不會出來,只是不會因為遇到 big5 不認識的字就卡住,雖然輸出的速度好像會比iconv慢,不過順利解決問題。 測試: ```php= $string = "轉碼測試功蓋銹abc轉碼測試"; $result = mb_convert_encoding($string,"utf-8","big5"); echo $result; ``` 用法: ```php= mb_convert_encoding( $str, $encoding1,$encoding2 ); $str,要轉換編碼文字 $encoding1,目標編碼,如utf-8,big5,大小寫均可 $encoding2,原始編碼,如UTF-8,BIG5,大小寫均可 mb_convert_encoding($str, "UTF-8"); //編碼轉換為utf-8 mb_convert_encoding($str, "UTF-8", "BIG5"); //原始編碼為BIG5轉UTF-8 mb_convert_encoding($str, "UTF-8", "auto"); //原始編碼不明,通過auto自動檢測,轉換UTF-8 ``` ---- ![](https://i.imgur.com/8fCQbU3.png) ![](https://i.imgur.com/94R6JHH.png) --- big5轉utf8,iconv不是個負責任的函數 ![](https://i.imgur.com/fEEloe4.png) --- 補充 ``` /* 轉換內部編碼為 SJIS */ $str = mb_convert_encoding($str, "SJIS"); /* 將 EUC-JP 轉換成 UTF-7 */ $str = mb_convert_encoding($str, "UTF-7", "EUC-JP"); /* 從 JIS, eucjp-win, sjis-win 中自動檢測編碼,並轉換 str 到 UCS-2LE */ $str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win"); /* "auto" 擴展成 "ASCII,JIS,UTF-8,EUC-JP,SJIS" */ $str = mb_convert_encoding($str, "EUC-JP", "auto"); // auto可以自動判斷 ``` --- --- ## 無使用程式消除亂碼 引用 >「為什麼這個檔案我用 Excel 開都是亂碼呢?要怎麼可以顯示成正常的文字啊?」同事看著電腦無助的問著我! 其實這個問題很常遇到,***尤其是如果你使用 Excel 去開啟 CSV 檔時就很容易中槍***。 像是現在最流行的政府公開資料,很多資料來源都是 CSV 檔,當你要使用 Excel 開啟編輯時,就常會看到讓你不知所措的亂碼! > ## 為什麼會產生亂碼? > 我們先來了解一下什麼是 CSV 檔,CSV 的英文是 Comma-Separated Values,***也就用逗號 (,) 分隔來代表的資料值*** > 再白話一點來說明:***如果一個儲存資料的檔案,每一列是一筆資料,每個資料欄位之間用逗號來分隔,就是用 CSV 的格式來儲存。其實 CSV 檔案也不一定都是用逗號,也有可以是其他符號,或是很多人會用 Tab 鍵來分隔。*** >***那為什麼用 Excel 開會產生亂碼呢?*** > ***Excel 預設是用 ANSI 的方式來進行檔案的開啟及儲存*** > ***繁體中文使用 ANSI 在 Windows 的電腦中的編碼就是 Big5。*** > > 但是目前許多提供 CSV 資料來源的檔案,都是採用 Unicode 來編碼, 一旦利用 Excel 來開啟時就會因為編碼不符而以亂碼來顯示了! > ## 亂碼解決的方式 > 如果要解決這個問題,有二個方式: > 1. 將原來用 Unicode 編碼的檔案,轉為用 ANSI 的 Big5。 > 2. 在原來的檔案加入一個標記,讓 Excel 知道要用 Unicode 的編碼來開啟。 >我個人建議是用第 2 種方式來解決,原因是我不建議隨便更動檔案的原始編碼,因為這個檔案可能不只是要讓 Excel 來使用,可能還有其他的程式要開啟。如果你只為了要讓 Excel 可以看到內容而更動了編碼,那可能就會影響其他的程式使用了。 ![](https://i.imgur.com/zG9qhiu.png) ![](https://i.imgur.com/fuES147.png) 從這張圖 就知道CSV格式中所謂的,(逗號)資料欄為了 ![](https://i.imgur.com/ev69MQj.png) ![](https://i.imgur.com/KupM7Em.png) 引用 >其實我們在用記事本另存新檔時,因為有設定 UTF-8 的編碼 在存檔的當下會在該檔的最前方加入一個 BOM 的標記,這個標記的作用就是告訴軟體在開啟時要使用什麼編碼。也就是因為如此,Excel 在開啟時就知道要用 UTF-8 的編碼來開啟,所以就不會顯示亂碼啦! >如此一來,檔案的本身可以保持原來的編碼,Excel 也能正確開啟,是不是又快,又能解決問題呢?快點學起來喔!