使用 Mac 版本「Microsoft Excel」開啟 CSV 檔案,會遇到檔案內容亂碼的問題。使用 Mac 終端機指令加上 BOM 編碼,快速解決問題。
Photo by Direct Media on StockSnap |
問題狀況
如果已經設定 Mac 預設開啟 CSV 檔案的應用程式是「Microsoft Excel」,點選兩下 CSV 檔案,就會使用 Excel 開啟 CSV 檔案。(如果不清楚如何修改預設應用程式,請參考 Apple 說明文件)
檔案開啟狀況
- CSV 檔案 UTF-8 編碼,不包含 BOM (位元組順序記號,英文簡稱:Byte Order Mark):點選兩下 CSV 檔案,Excel 開啟會亂碼
- CSV 檔案 UTF-8 編碼,包含 BOM:點選兩下 CSV 檔案,Excel 開啟正常
- CSV 檔案 UTF-16LE 編碼,不包含 BOM:Excel 開啟不會亂碼,但是不同欄位擠在同一
- CSV 檔案 UTF-16LE 編碼,包含 BOM:Excel 開啟不會亂碼,但是不同欄位擠在同一欄
因此問題的解決方向,朝向第 2 狀況:UTF-8 編碼的 CSV 檔案加上 BOM。
解決方式
1. 開啟終端機應用程式 (terminal)
2. 修正以下 BASH 指令要處理的輸入檔案名稱,輸出的新檔名可以不用修改
# 指定要處理的檔案名input_file="example UTF-8.csv"# 指定增加 BOM 之後的新檔案名。可以不修改,預設是檔案後面加上 .utf8bom.csvoutput_file="${input_file}.utf8bom.csv"# 增加 UTF-8 BOM (Byte Order Mark) 到檔案的開頭# BOM 的十六進制編碼是 EF BB BF# 使用 `cat` 讀取原始檔案的內容,然後與 BOM 結合# 最後,將結果儲存到新檔案echo -e "\xEF\xBB\xBF$(cat ${input_file})" > "${output_file}"# 輸出提示資訊echo "Added UTF-8 BOM to ${input_file}, saved as ${output_file}."
執行 BASH 指令,就會自動產生可以點選兩下 CSV 檔案,使用 Excel 開啟 CSV 不會變亂碼的檔案。
如果原始檔案的欄位值以文字類型為主,不需要額外指定資料型態,上述方法可以很快處理亂碼問題。如果原始資料類型包含長數字,需要指定資料型態,就會需要使用「匯入字串精靈」,可參考「解決 Excel 長數字的最後一位歸零或出現科學記號的問題」。
解決方式說明
BOM 是 Windows 視窗作業系統用來辨識 UTF-8 編碼檔案的編碼文字,將 BOM 編碼文字加上 CSV 檔案檔案開頭。
echo -e "\xEF\xBB\xBF$(cat ${input_file})" > "${output_file}"
echo 指令目的是顯示檔案內容。加上 -e 變數選項,可以加上特殊符號,並且格式化輸出內容。UTF-8 編碼的 BOM 是「\xEF\xBB\xBF」與輸入的 CSV 檔案內容結合。
echo -e "\xEF\xBB\xBF$(cat ${input_file})" > "${output_file}"
最後,將結果儲存到新檔案
echo -e "\xEF\xBB\xBF$(cat ${input_file})" > "${output_file}"
其他技術問題排除
1. 檢查檔案的文字編碼
file -I 檔名
- 如果是 UTF-8 編碼,不管有無 BOM,結果顯示 charset=utf-8
- 如果是 UTF-16LE 編碼,結果顯示 charset=utf-16le
2. 檢查檔案是否包含 BOM
hexdump -n 3 -C 檔名
第一行結果提到 ef bb bf 代表 UTF-8 編碼檔案包含 BOM
00000000 ef bb bf |...|00000003
第一行結果提到 ff fe 代表 UTF-16LE 編碼檔案包含 BOM
00000000 ff fe 42 |..B|00000003
失敗的嘗試
將原始 UTF-8 編碼、不包含 BOM 的 CSV 檔案,轉檔成 UTF-16LE 編碼的檔案,會變成 binary。
% iconv -t utf-16le "example UTF-8.csv" > result.csv% file -I result.csvresult.csv: application/octet-stream; charset=binary
需要加上BOM「\xFF\xFE」再轉換到 UTF-16LE 編碼,才能順利看到不是 binary 的 CSV 內容
file="example UTF-8.csv"echo -e "\xEF\xBB\xBF$(cat $file)" > "$file.utf8bom.csv"iconv -t utf-16le "$file.utf8bom.csv" > "$file.utf16lebom.csv"
版本資料
Mac 版 Microsot Excel 版本 16.77
參考資料
- 位元組順序記號 - 維基百科,自由的百科全書
- 在 Mac 上選擇 App 來打開檔案 - Apple 支援 (台灣)
- A Practical Guide To Linux Echo Command - Earthly Blog
- unicode - iconv generating UTF-16 with BOM - Super User
- unicode - How can I check if a UTF-8 text file has a BOM? - Unix & Linux Stack Exchange
- unicode - iconv generating UTF-16 with BOM - Super User
- Comments in command-line Zsh - Stack Overflow
留言
張貼留言