快速解決 Mac 版 Excel 開啟 CSV 檔案是亂碼問題

使用 Mac 版本「Microsoft Excel」開啟 CSV 檔案,會遇到檔案內容亂碼的問題。使用 Mac 終端機指令加上 BOM 編碼,快速解決問題。

Photo by Direct Media on StockSnap

問題狀況

如果已經設定 Mac 預設開啟 CSV 檔案的應用程式是「Microsoft Excel」,點選兩下 CSV 檔案,就會使用 Excel 開啟 CSV 檔案。(如果不清楚如何修改預設應用程式,請參考 Apple 說明文件)

檔案開啟狀況

  1. CSV 檔案 UTF-8 編碼,不包含 BOM (位元組順序記號,英文簡稱:Byte Order Mark):點選兩下 CSV 檔案,Excel 開啟會亂碼
  2. CSV 檔案 UTF-8 編碼,包含 BOM:點選兩下 CSV 檔案,Excel 開啟正常
  3. CSV 檔案 UTF-16LE 編碼,不包含 BOM:Excel 開啟不會亂碼,但是不同欄位擠在同一
  4. CSV 檔案 UTF-16LE 編碼,包含 BOM:Excel 開啟不會亂碼,但是不同欄位擠在同一欄


因此問題的解決方向,朝向第 2 狀況:UTF-8 編碼的 CSV 檔案加上 BOM。

解決方式

1. 開啟終端機應用程式 (terminal)

2. 修正以下 BASH 指令要處理的輸入檔案名稱,輸出的新檔名可以不用修改

# 指定要處理的檔案名
input_file="example UTF-8.csv"

# 指定增加 BOM 之後的新檔案名。可以不修改,預設是檔案後面加上 .utf8bom.csv
output_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.csv
result.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

參考資料



留言