Try   HackMD

CSV/Excel 編碼2 匯出成csv中文亂碼/難字

tags: csv

[EXCEL] Excel打開是亂碼?快速找回資料的最好方法!

PHP big5轉utf8不要用iconv(),iconv這個函數,用mb_convert_encoding

這篇比較清楚建議讀這篇
[PHP] iconv big5轉換utf8問題

解決匯出 CSV 的亂碼問題

文章內所有技術版權皆不來自於我


PHP中有方便的內建函數
可以直接轉換編碼
常常遇到客戶需要將資料轉換成csv檔的事情中
有哪些需要注意呢?

CSV 用 Excel開怎麼都看到亂碼該怎麼辦??

目錄

  • 使用程式消除亂碼
  • 解決匯出 CSV 的亂碼問題
  • iconv big5轉換utf8問題
  • 補充
  • 無使用程式消除亂碼

使用程式消除亂碼

根據第二篇說法
是轉換到一半會直接停止
但自己剛剛試了後出來的文件都是全白檔案
即使將難字後在後端也是整份文件為白色

可見我還不太會== 不過目前可以使用中文部亂碼就好
剩下的都之後再說

解決匯出 CSV 的亂碼問題

透過 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 在整份文件中只要輸出一次就好


iconv big5轉換utf8問題

不要以為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

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


big5轉utf8,iconv不是個負責任的函數

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


補充

/* 轉換內部編碼為 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 可以看到內容而更動了編碼,那可能就會影響其他的程式使用了。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

從這張圖
就知道CSV格式中所謂的,(逗號)資料欄為了

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

引用

其實我們在用記事本另存新檔時,因為有設定 UTF-8 的編碼
在存檔的當下會在該檔的最前方加入一個 BOM 的標記,這個標記的作用就是告訴軟體在開啟時要使用什麼編碼。也就是因為如此,Excel 在開啟時就知道要用 UTF-8 的編碼來開啟,所以就不會顯示亂碼啦!

如此一來,檔案的本身可以保持原來的編碼,Excel 也能正確開啟,是不是又快,又能解決問題呢?快點學起來喔!