csv
[EXCEL] Excel打開是亂碼?快速找回資料的最好方法!
PHP big5轉utf8不要用iconv(),iconv這個函數,用mb_convert_encoding
這篇比較清楚建議讀這篇
[PHP] iconv big5轉換utf8問題
文章內所有技術版權皆不來自於我
PHP中有方便的內建函數
可以直接轉換編碼
常常遇到客戶需要將資料轉換成csv檔的事情中
有哪些需要注意呢?
CSV 用 Excel開怎麼都看到亂碼該怎麼辦??
根據第二篇說法
是轉換到一半會直接停止
但自己剛剛試了後出來的文件都是全白檔案
即使將難字後在後端也是整份文件為白色
可見我還不太會== 不過目前可以使用中文部亂碼就好
剩下的都之後再說
透過 PHP 輸出 CSV 檔案時,常常發生一個狀況,就是如果這個檔案裏面有中文,直接用 excel 打開 CSV 會發現中文都是亂碼!
其實只要一個很簡單的方法,就是讓這個 CSV 檔案最前面有 BOM (Byte Order Mark),這樣用 Excel 開起來就不會有問題囉!
方法如下,輸出 \xEF\xBB\xBF 即可 (用於 UTF8)
$fp = fopen('file.csv', 'w');
// output BOM
fwrite($fp, "\xEF\xBB\xBF");
fputcsv($fp, $data);
fclose($fp);
BOM 在整份文件中只要輸出一次就好
不要以為big5轉utf8就用iconv()這麼簡單
iconv("big5", "UTF-8", $str);
big5有很多字是沒有收錄的:
綫、綉、滙、栢、峯、頴、邨、着、双
iconv這個函數他遇到轉不出來的字,就停住了,可能會造成輸出文件中斷,導致文件結構錯誤。
請改用 mb_convert_encoding ,別高興太早 big5 沒有的字依然不會出來,只是不會因為遇到 big5 不認識的字就卡住,雖然輸出的速度好像會比iconv慢,不過順利解決問題。
測試:
$string = "轉碼測試功蓋銹abc轉碼測試";
$result = mb_convert_encoding($string,"utf-8","big5");
echo $result;
用法:
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
big5轉utf8,iconv不是個負責任的函數
補充
/* 轉換內部編碼為 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 來開啟時就會因為編碼不符而以亂碼來顯示了!
亂碼解決的方式
如果要解決這個問題,有二個方式:
- 將原來用 Unicode 編碼的檔案,轉為用 ANSI 的 Big5。
- 在原來的檔案加入一個標記,讓 Excel 知道要用 Unicode 的編碼來開啟。
我個人建議是用第 2 種方式來解決,原因是我不建議隨便更動檔案的原始編碼,因為這個檔案可能不只是要讓 Excel 來使用,可能還有其他的程式要開啟。如果你只為了要讓 Excel 可以看到內容而更動了編碼,那可能就會影響其他的程式使用了。
從這張圖
就知道CSV格式中所謂的,(逗號)資料欄為了
引用
其實我們在用記事本另存新檔時,因為有設定 UTF-8 的編碼
在存檔的當下會在該檔的最前方加入一個 BOM 的標記,這個標記的作用就是告訴軟體在開啟時要使用什麼編碼。也就是因為如此,Excel 在開啟時就知道要用 UTF-8 的編碼來開啟,所以就不會顯示亂碼啦!
如此一來,檔案的本身可以保持原來的編碼,Excel 也能正確開啟,是不是又快,又能解決問題呢?快點學起來喔!