# 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 也能正確開啟,是不是又快,又能解決問題呢?快點學起來喔!