
Excel 開啟 CSV 為何出錯?UTF-8、引號、換行與前置零
CSV 開啟後出現亂碼、編號前面的零消失,或一個欄位被拆成多筆記錄,背後可能是不同問題。字元編碼、CSV 語法及試算表的類型推斷,需要逐項分辨。
本文按 RFC 4180 與 Microsoft 文件,整理如何核對檔案與匯入結果。操作名稱會因 Excel 的版本、平台及介面語言而不同,因此亦列出相關英文 UI 名稱。
日文原文發布: 2026-04-22
RFC 4180 描述共通格式,不是所有實作的保證
RFC 4180 是 Informational 資訊性文件,記述常見 CSV 格式及 text/csv 媒體類型,並非 Internet Standard。不能假定所有稱為 CSV 的檔案都按同一套規則處理。其結構可概括如下:
file = [header CRLF] record *(CRLF record) [CRLF]
header = name *(COMMA name)
name = field
record = field *(COMMA field)
field = escaped / non-escaped文件以逗號分隔欄位、CRLF 分隔記錄;最後一筆的結尾換行可省略。以雙引號包住的欄位可以包含逗號及換行,內部的雙引號則重複一次。
MIME 的 charset 參數可省略,也可指定 US-ASCII 以外的字元集。副檔名 .csv 不能決定編碼;本機檔案若沒有 MIME 宣告,收發雙方須另行約定。
亂碼:先核對 UTF-8 與 BOM
Microsoft 說明指出,UTF-8 CSV 帶有 BOM 時,可用一般開啟檔案方式處理。不帶 BOM 時,可在 Excel 的 Data(資料)中使用 Get Data(取得資料)或 From Text/CSV 等入口,明確選擇 UTF-8。實際名稱和位置依版本、平台及語言而異。
不能斷言沒有 BOM 就一定被當成 Big5 或 Shift_JIS。直接開啟與明確匯入的推斷可能不同。以下 Python 3 例子輸出 UTF-8 BOM 及 CRLF:
import csv
with open("users.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f, lineterminator="\r\n")
writer.writerows([["name", "id"], ["Renée", "0123"]])BOM 只提供編碼線索,沒有將 id 欄指定為文字,也不會保護 0123 的前置零。接收系統不需要 BOM 時,可把 encoding 改成 "utf-8"。保留原檔,綜合來源宣告、BOM、明確設定及內容判斷,避免只靠自動偵測便覆寫。
一個欄位可以跨越多行
實際檔案可能使用 CRLF、LF 或舊式 CR。不能只按製作檔案的操作系統推斷分隔方式;若連引號內的換行一併取代,欄位內容也會改變。
id,姓名,備註
1,阿陳,"請參閱
下一行"
2,阿李,沒有備註這段文字看起來有四行,實際上是三筆 CSV 記錄:標題加兩筆資料。只用 split("\n") 會把欄位內的換行拆開;逐行再按逗號分割亦不是完整 CSV 解析器。須使用理解已約定分隔符號及引號規則的解析器。
雙引號要重複,反斜線不能代替
欄位包含逗號、雙引號或換行時,須按規則加上引號。例如原值有逗號,並用引號括住 CSV 一詞:
"已出席, 詢問了 ""CSV"""外層雙引號界定整個欄位,內部連續兩個雙引號還原為一個。反斜線加引號不是 RFC 4180 的跳脫規則,單引號也不能取代雙引號作欄位定界符號。全形標點與 ASCII 逗號並非同一字元。
所有欄位都加雙引號是一種輸出策略,但不會指定儲存格類型,也不保證阻止公式解讀。CSV 語法跳脫與公式注入防護是不同問題。
前置零、長編號與日期可能被自動轉換
如表格未能完整顯示,可左右捲動。
| 原值 | 可能解讀 | 資料風險 |
|---|---|---|
| 0123 | 數值 123 | 前置零消失 |
| 3E2 | 數值 300 | 文字表示改變 |
| 3/4 | 日期 | 日月次序及假定年份依設定而異 |
| 12345678901234567 | 數值 | 超出 Excel 的 15 位有效數字精度,尾端數字可能遺失 |
以上只是可能結果,並非每個環境必然如此。識別碼或看似日期的代碼,應在匯入時將欄設為 Text(文字)。Power Query 若已作類型轉換,要檢查該步驟,必要時從原檔重新匯入。事後改顯示格式,不能找回已遺失的數字。
在開頭加 Tab 會改變原值。="0123" 是 Excel 公式,不是文字類型宣告;把不可信輸入包進公式亦不是通用解法。若改用 xlsx,仍須明確輸出文字儲存格,而不是只改副檔名。
地區設定與匯入方式須一併確認
Windows 地區設定等條件可能令 Excel 使用分號作清單分隔符號。小數符號與欄位分隔符號不同,先確認接收程式是否真的按逗號解析。
Excel、Google Sheets 和 LibreOffice Calc 的行為應按實際版本、平台及匯入入口檢查,不宜一概稱為符合 RFC。用副本及少量已知資料,逐項核對編碼、引號、換行、分隔符號及類型轉換,再比對重新匯出的數據。
其他格式能解決哪些問題?
- TSV 以 Tab 分隔,欄位內的 Tab 及換行仍須約定處理方式。
- JSON/JSON Lines 可表達字串、數字、布林值、null、陣列及物件;大整數與日期仍要另定約定。
- xlsx 支援儲存格類型、公式及多張工作表。
- Parquet 是適合分析流程的欄式二進位格式。
- SQLite 是可用 SQL 查詢的資料庫檔案。
選擇時要考慮接收端支援、類型保存、資料量及編輯方式。更換格式並不會自動令資料交換安全或無損。
交付檔案前的核對清單
- 約定編碼及 BOM;需要 Excel 一般開檔兼容性時,可考慮 UTF-8 加 BOM。
- 交換 RFC 4180 所述格式時,以 CRLF 分隔記錄。
- 一致處理引號,測試逗號、雙引號及欄位內換行。
- 匯入需要保留的識別碼及長編號時,明確指定為文字。
- 將公式處理與一般 CSV 跳脫分開評估。
- 保留原檔,覆寫前比較匯入值及再次匯出的內容。
二進位編輯器可檢查 EF BB BF 或 CRLF 等位元組,但不能代替 CSV 解析器或試算表的類型設定。
重點整理
- 編碼、CSV 語法及類型推斷要分開診斷。
- RFC 4180 不會決定所有接收程式的行為。
- BOM 幫助識別 UTF-8,不能保護前置零或長數字。
- 明確匯入為文字並保留原檔,才能核對自動轉換前後的差異。
參考資料及來源
編輯說明
本文使用 AI 協助編輯,並在發布前由編輯核對。內容仍可能包含事實、理解或時效上的錯誤;作出重要決定前,請查閱所列的一手資料或官方文件。

